python 中property、__getattr__和__setattr__

文章探讨了Python类中使用property和__getattr__/__setattr__方法来处理对象属性的不同方式。property通常用于创建带有访问控制的属性,而__getattr__/__setattr__在属性集不确定或需要动态处理时提供更灵活的接口。示例代码展示了这两种方法的用法和效果。
摘要由CSDN通过智能技术生成
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通常就只是一种可选和冗余的扩展功能了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值