python property动态属性

class Foo:
    def __init__(self):
        self.name = 'a'

    def bar(self):
        print('bar')

    # 属性/特性
    @property   #用于执行obj.per(只是一个对应关系,即执行obj.per找到@property下的per方法并执行,至于per方法里面做什么自定义)
    def per(self):
        print('123')
        return 1
    @per.setter #用于执行obj.per = 888(只是一个对应关系,即执行obj.per = 888找到@per.setter下的per方法并执行,至于per方法里面做什么自定义)
    def per(self,val):
        print(val)
    @per.deleter #用于执行del obj.per(只是一个对应关系,即执行del obj.per找到@per.deleter下的per方法并执行,至于per方法里面做什么自定义)
    def per(self):
        print(666)

obj = Foo()
#obj.per() #TypeError: 'NoneType' object is not callable
r = obj.per
#123
print(r)
#1
obj.per = 888
#888
del obj.per
#666
from datetime import date, datetime
class User:
    def __init__(self, name, birthday):
        self.name = name
        self.birthday = birthday
        self._age = 0

    # def get_age(self):
    #     return datetime.now().year - self.birthday.year

    @property
    def age(self):
        return datetime.now().year - self.birthday.year

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

if __name__ == "__main__":
    user = User("bobby", date(year=1987, month=1, day=1))
    user.age = 30  # 调用user对象中有@age.setter装饰器的函数age,即执行self._age = value,self._age = 30
    print(user._age)  # 调用user对象中的_age属性
    # 30
    print(user.age)  # 调用user对象中有@property装饰器的函数age,即执行datetime.now().year - self.birthday.year并返回
    # 32

 

posted @ 2019-03-14 09:47  小宇子2B  阅读(214)  评论(0编辑  收藏  举报