Как сделать так, чтобы при передаче аргументов классу не учитывался аргумент self?
Я только начал изучать ООП и мне показалось интересным сделать проверку класса на ошибки, но при запуске моего кода у меня выходит ошибка:
Traceback (most recent call last):
File "C:\Users\Я\Python\proects\test.py", line 21, in <module>
Class.StartTest()
File "C:\Users\Я\Python\proects\test.py", line 17, in StartTest
test_unit.self.name_function()
AttributeError: 'main' object has no attribute 'self'
Вот мой код ---
class main():
def __init__(self, name, addr):
self.name=name
self.addr=addr
def Fun(self):
return "{} {}".format(self.name.title(),self.addr.lower())
class TestClass:
def __init__(self, name_class, args, name_function):
self.name_class=name_class
self.args=args
self.name_function=name_function
def StartTest(self):
test_unit=self.name_class(*self.args)
test_unit.self.name_function()
Class=TestClass(main, ['adA', 'LoVeLacE'], main.Fun)
Class.StartTest()
Скажите, как избавиться от этой ошибки, ведь при передаче аргументов напрямую все нормально, а при передаче аргументов классу через другой класс возникает данная ошибка
Ответы (3 шт):
В функции StartTest последняя строчка должна быть print(self.name_function(test_unit)), ну или return ..., смотря чего Вы хотите...
У Вас в ошибке все написано. У объекта test_unit у Вас нет атрибута self. Вы в класс закидываете класс, список с параметрами и метод класса. Вам в итоге надо работать с объектом класса при тестировании, а Вы пытаетесь из test_unit вытащить его самого.
Мое мнение, что в Вашем случае, если вы хотите тестировать какой-то внутренний метод, то Вам нужно получать объект из тестируемого класса, а потом с ним работать. В Вашей постановке надо вытащить имя метода через магию __name__ (см. пример ниже), а уже после через getattr(object, name) вытащить из объекта ссылку на метод и запустить его.
class ExampleClass():
def __init__(self, name, addr):
self.name = name
self.addr = addr
def fun(self):
return "{} {}".format(self.name.title(), self.addr.lower())
class TestClass:
def __init__(self, name_class, args, name_function):
self.name_class = name_class
self.args = args
self.name_function = name_function.__name__
def start_test(self):
test_unit = getattr(self.name_class(*self.args), self.name_function)
return test_unit()
case = TestClass(ExampleClass, ['adA', 'LoVeLacE'], ExampleClass.fun)
print(case.start_test())
Метод класса и метод экземпляра это разные вещи. Если метод вызывать от класса, то в self передается тип, а не экземпляр. Когда вы сделали инициализацию строкой выше, то экземпляр вернулся, но связь с методом, который получили ранее у него не возникла.