标签:set lex open 就是 count play 优先 def 功能
一个静态属性property本质就是实现了get,set,delete三种方法
用法:
class Foo: @property def AAA(self): print(‘get的时候运行我啊‘) @AAA.setter def AAA(self,value): print(‘set的时候运行我啊‘) @AAA.deleter def AAA(self): print(‘delete的时候运行我啊‘) #只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter f1=Foo() f1.AAA f1.AAA=‘aaa‘ del f1.AAA
class Foo: def get_AAA(self): print(‘get的时候运行我啊‘) def set_AAA(self,value): print(‘set的时候运行我啊‘) def delete_AAA(self): print(‘delete的时候运行我啊‘) AAA=property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应 f1=Foo() f1.AAA f1.AAA=‘aaa‘ del f1.AAA
class Goods: def __init__(self): # 原价 self.original_price = 100 # 折扣 self.discount = 0.8 @property def price(self): # 实际价格 = 原价 * 折扣 new_price = self.original_price * self.discount return new_price @price.setter def price(self, value): self.original_price = value @price.deleter def price(self): del self.original_price obj = Goods() obj.price # 获取商品价格 obj.price = 200 # 修改商品原价 print(obj.price) del obj.price # 删除商品原价
#实现类型检测功能 #第一关: class People: def __init__(self,name): self.name=name @property def name(self): return self.name # p1=People(‘alex‘) #property自动实现了set和get方法属于数据描述符,比实例属性优先级高,所以你这面写会触发property内置的set,抛出异常 #第二关:修订版 class People: def __init__(self,name): self.name=name #实例化就触发property @property def name(self): # return self.name #无限递归 print(‘get------>‘) return self.DouNiWan @name.setter def name(self,value): print(‘set------>‘) self.DouNiWan=value @name.deleter def name(self): print(‘delete------>‘) del self.DouNiWan p1=People(‘alex‘) #self.name实际是存放到self.DouNiWan里 print(p1.name) print(p1.name) print(p1.name) print(p1.__dict__) p1.name=‘egon‘ print(p1.__dict__) del p1.name print(p1.__dict__) #第三关:加上类型检查 class People: def __init__(self,name): self.name=name #实例化就触发property @property def name(self): # return self.name #无限递归 print(‘get------>‘) return self.DouNiWan @name.setter def name(self,value): print(‘set------>‘) if not isinstance(value,str): raise TypeError(‘必须是字符串类型‘) self.DouNiWan=value @name.deleter def name(self): print(‘delete------>‘) del self.DouNiWan p1=People(‘alex‘) #self.name实际是存放到self.DouNiWan里 p1.name=1
标签:set lex open 就是 count play 优先 def 功能
原文地址:https://www.cnblogs.com/xiangtingshen/p/10467093.html