class P1: def getsex(self): return "M" def setsex(self,value): print(f"set sex:{value}") self._sex=value sex=property(getsex,setsex,None)
class P2:
def __getattr__(self, item): if item=="sex": return "M" else: raise AssertionError(item) def __setattr__(self, key, value): print(f"set {key}:{value}") if key=="sex": self.__dict__["_sex"]=value else: self.__dict__[key]=value
if __name__ == "__main__":
p1=P1() p1.job="server" print(p1.job) print(p1.sex) p1.sex="F" print(p1._sex) print("p1.__dict__:",p1.__dict__)
p2=P2() print(p2.job) p2.job="server" print(p2.job) p2.sex="F" print(p2.sex) print(p2._sex) print("p2.__dict__:",p2.__dict__)
两种方法等到效果类似,但是__getattr_或__setattr__适合在编写类时无法确定属性集,甚至无法以确定何种具体形式存在的情况下使用,更为动态或通用的接口。而property通常就只是一种可选和冗余的扩展功能了。