Mayan
Mayan

Reputation: 492

How to call a method when an attribute is written

I want to call a method when an attribute of an object is written. For example:

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

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

If i want to call .isAdult() when an object's age is written a value, how can I achieve this?

I heard of people suggesting to use decorators, but they didn't give more details.

Upvotes: 2

Views: 71

Answers (2)

Dahoon Hong
Dahoon Hong

Reputation: 54

you can use decorator in class like below.

In below code, isAdultDeco will be call when you create Person object.

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

Upvotes: -1

Selcuk
Selcuk

Reputation: 59315

What you want to have is called a setter. You must use new-style classes and extend object to use them:

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()

Then, for example:

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

will print

False
True

Upvotes: 3

Related Questions