版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (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