#python #function #lambda #call #init
#python #функция #лямбда #вызов #инициализация
Вопрос:
Я пытаюсь передать некоторые аргументы через переменные init (в класс Cat, который наследуется в классе Dog).
Что я хочу сделать, так это: всякий раз, когда методы в Cat используют переменную self.dynamic, они вызывают функцию. Вместо этого с помощью этого кода он просто отправляет результат первого вызова функции.
(неправильный пример)
class Dog(object):
def __init__(self):
self.var = None
self.dynamic = self.function()
def change_var(self):
self.var = 'something'
print 'var has something'
def function(self):
if self.var:
return 'full'
else:
return 'empty'
def final_function(self):
return 'it is ' self.dynamic
my_instance = Dog()
print my_instance.dynamic
>>>empty # as it should
my_instance.change_var()
>>>var has something # as it should
print my_instance.final_function()
>>>it is empty # it didnt update since 'self.var' has the first value stored
Я нашел решение, используя lambda, но я не уверен, что это лучший способ сделать это.
class Dog(object):
def __init__(self):
self.var = None
self.dynamic = lambda: self.function()
def change_var(self):
self.var = 'something'
print 'var has something'
def function(self):
if self.var:
return 'full'
else:
return 'empty'
def final_function(self):
return 'it is ' self.dynamic()
my_instance = Dog()
print my_instance.dynamic()
>>>empty # as it should
my_instance.change_var()
>>>var has something
print my_instance.final_function()
>>>it is full # it works!!
Есть ли лучший способ сделать вышеописанное?
PS: Не уверен, что использую правильные слова для описания вещей, но я новичок в программировании (и Python).
Ответ №1:
Вам не нужен лямбда. Функции и методы уже являются объектами первого класса и могут быть назначены переменным:
self.dynamic = self.function
Хотя я должен сказать, что я не знаю, что любой из них дает вам по сравнению с простым вызовом self.function напрямую.