# -*- coding:utf-8 -*- # 非数据描述符 代理Room的area属性 class property: def __init__(self,func): # print(func) # <function Room.area at 0x00578C00> Room类area方法的 self.func = func def __get__(self, instance, owner): # print(instance) # <__main__.Room object at 0x021157D0> 实例对象 # print(owner) # <class '__main__.Room'> Room类 fun = self.func(instance) # Room类的area方法 把实例对象传入运行 return fun # 返回结果 class Room: def __init__(self,name,width,length): self.name = name self.width = width self.length = length @property # area = property(area) def area(self): return self.width * self.length r1 = Room("别墅",10,10) print(r1.area) # 实例调用方法 先查找自己属性字典 然后找类的属性字典 发现属性被 非数据属性代理 # print(r1.__dict__) # print(Room.__dict__)
两种方法设置property
class Foo: @property def aaa(self): print("get") @aaa.setter def aaa(self,val): print("set") @aaa.deleter def aaa(self): print("del") f = Foo() f.aaa # get f.aaa = "aaa" # set del f.aaa # del
-----------------------------------------------------------
class Foo: def get_aaa(self): print("get") def set_aaa(self,val): print("set") def del_aaa(self): print("del") aaa = property(get_aaa,set_aaa,del_aaa) f = Foo() f.aaa f.aaa = "aaa" del f.aaa