Как вызвать метод, когда атрибут написан - PullRequest
2 голосов
/ 27 сентября 2019

Я хочу вызвать метод при записи атрибута объекта.Например:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def isAdult(self):
        print(True if self.age>=21 else False)

Если я хочу вызвать .isAdult(), когда для объекта age записано значение, как я могу этого достичь?

Я слышал о людях, предлагающих использоватьдекораторы, но они не дали больше подробностей.

Ответы [ 2 ]

3 голосов
/ 27 сентября 2019

То, что вы хотите получить, называется setter.Вы должны использовать классы нового стиля и расширить object, чтобы использовать их:

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self._age = age

    def isAdult(self):
        print(self.age >= 21)

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        self._age = value
        self.isAdult()

Затем, например:

p = Person("John Doe", 12)
p.age = 16
p.age = 25

напечатает

False
True
0 голосов
/ 27 сентября 2019

вы можете использовать декоратор в классе, как показано ниже.

В приведенном ниже коде isAdultDeco будет вызываться при создании объекта Person.

class Person:
    def isAdultDeco(func):
        def foo(self, name, age):
            func(self, name, age)
            print(True if self.age>=21 else False)
        return foo


    @isAdultDeco
    def __init__(self, name, age):
        self.name = name
        self.age = age

Person('a',22) # True
Person('a',20) # False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...