python属性
<1>属性包装:将方法包装成属性,以隐藏相关的现实,进而控制属性的类型或范围;是虚拟的属性
外界访问时就可以像访问类属性一样使用点(.)的方式
<2>属性包装的三种操作:
<1>@property
<2>@property_name.setter
<3>@property_name.deleter
例子:
class Person:
def __init__(self, name="seven", age=None):
self._name = name
self.age = age
@property
def name(self):
return self.name
@name.settter
def name(self, name):
if 0 < name <=18:
self._name = name
else:
print("errors!")
if __name__ == '__main__':
p = Person()
print(p.name)
<3>__call__():让类的实例像方法一样可调用
class Pepole:
def __call__(self):
print("call")
if __name__ == '__main__':
p = Person()
p()
<4>描述符
将实现特殊协议方法的类作为另外一个类的类属性,用来拦截和控制属性访问并可以重复利用
协议方法:
__get__()
__set__()
__delete__()
分类:
数据描述:实现了全部的协议方法
非数据描述:实现部分的协议方法
说明:所有的类成员函数都是非数据描述,因为类成员函数只实现了协议方法中的一种
同名的实例属性和非数据描述符(以方法为例,会覆盖方法)访问的优先级
note:这只能在新式类中使用
class Person:
def __init__(self, defautl=0):
self.default = default
def __get__(self, instance, owner):
return self.defautl
def __set__(self, instance, val):
if val > 0:
self.default = val
else:
print("done")
def __delete__(self, instance):
pass
class Score:
core = Person()
cores = Person()
if __name__ == '__main__':
s = Score()
print(s.core)
print(s.cores)
s.cores = 2
print(s.cores)
s.core = -2
print(s.core)