python中的属性装饰器

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons
class Person:

    def __init__(self, name, age=18):
        self.name = name
        self.__age = age

    @property  # 属性装饰器,该装饰器装饰方法,下文中都必须用该方法
    def age(self):  # 给你看,不希望你修改
        print('getter')
        return self.__age

    @age.setter  # 此装饰器必须是age开头,可以修改私有属性
    def age(self, age):
        self.__age = age
        print('setter')

    @age.deleter
    def age(self):
        print('del')
        # del self.__age  # 一般不需要删除


tom = Person('Tom')
print(tom.age)
tom.age = 20  # 不管你是私有属性还是保护属性,用户只想通过普通属性修改和访————属性装饰器
print(tom.age)

还可以不使用装饰器,实现上述的功能:

class Person:

    def __init__(self):
        self.name = 'tom'
        self.__age = 20

    def get_age(self):
        return self.__age  # 可以写成lambda表达式

    def set_age(self, age):  # 不能改写为lambda表达式,lambda表达式不能有等号
        self.__age = age

    age = property(get_age, set_age)  # property是类


t = Person()
print(t.get_age())
t.set_age(30)
print(t.age)
t.age = 300
print(t.age)

还可以对上述的代码修改为lambda表达,注意setter方法不能转换为lambda表达式

class Person:

    def __init__(self):
        self.name = 'tom'
        self.__age = 20

    age = property(lambda self: self.__age)  # property是类, 该方法是getter


t = Person()
print(t.age)
# t.age = 300  # 此方法没有setter,只有getter

猜你喜欢

转载自blog.csdn.net/sqsltr/article/details/90311380
今日推荐