类的一个特性就是封装,能够把一些东西隐藏起来,不让外部直接访问,可以通过属性装饰器来对外提供方法。
getter:
读取属性
setter:
设置属性
deleter:
删除属性
property类
class property(fget=None, fset=None, fdel=None, doc=None)
return a property attribute
属性装饰器用法一
class Person:
def __init__(self, name):
self._name = name
@property
def name(self): #等价于name = property(name)
return self._name
@name.setter #等价于name = name.setter(name)
def name(self, value):
self._name = value
@name.deleter #等价于name = name.deleter(name)
def name(self):
# del self._name
print('del name')
tom = Person('Tom')
print(tom.name) #自动使用getter方法
tom.name = 'Jerry' #自动使用setter方法
print(tom.name)
print(tom.__dict__)
property装饰器
这个装饰器必须包含,被它装饰的函数名就是它的属性名,只有property装饰器时就是只读属性,会调用getter方法。
setter装饰器
与属性名同名,接收两个形参,一个是self一个是修改属性时添加的值。有了setter装饰器,属性就可以写。
deleter装饰器
一般比较少使用,用于删除属性
属性装饰器通过简单的方式,把对方法的操作变成对属性的访问,并且能够起到一定的隐藏效果
属性装饰器用法二
class Person:
def __init__(self, name, age=18):
self._name = name
self._age = age
def get_properties(self):
return 'name: {}, age: {}'.format(self._name, self._age)
def set_properties(self, value):
self._name = value
def del_properties(self):
del self._name
propertites = property(get_properties, set_properties, del_properties)
tom = Person('TOM', 21)
print(tom.propertites)
tom.propertites = 'jerry'
print(tom.propertites)
del tom.propertites
print(tom.__dict__)
这种方式和上面的实现方法不一样,但是调用方式是一样的,因此这两种方法其实没有本质区别