Лучший способ заставить переменные в init ссылаться на возврат функции

#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 напрямую.