python的getattr和setattr_Python和中getattr,setattr self.__dict__

我一直在阅读关于重写getattr和setattr的内容,如果我使用self,就无法确定是否需要重写赋值。

有一次我举了个例子

a = OPT(foo='bar')

a.foo和一个[‘foo’]使用和不使用"getattr"和"setattr"声明。

如果我两者都需要,有人能解释一下吗?如果我这样做,为什么?谢谢!

class OPT(dict):

__getattr__ = dict.__getitem__

__setattr__ = dict.__setitem__

def __init__(self, *args, **kwargs):

super(OPT, self).__init__(*args, **kwargs)

self.__dict__ = self

设置self.__dict__ = self可能不是一个好主意。您试图用这个代码完成什么?

我以obj或类似dict的方式访问这个类,所以我可以做一个[‘bar’]或一个.bar。像这个帖子

问题是,如果有人做了a['keys'] = 2,他们会踩到听写的keys()方法,等等。

哈,我没想到。我以前见过这个实现。有很多关于它的帖子,但我不记得那个问题会出现。

@布伦巴恩的评论真的是这里的答案。

当你和你getattr重写setattr想给一些额外的类或集合when the user属性得到平安。for example:P></

1)你可能avoid manipulates安安当用户通过数据库属性返回INVALID,你只是不知道for an unknown属性。P></

2)属性是真的manipulations forwarded / delegated知道the valid属性,例如是not known that represents提前行级数据库和用户manipulates columns作为属性。的运行时间need to check if the given name column name属性matches,也许我喜欢和我的上/下的房屋,房屋等。P></

another thing is preferred to有时,子类的控制。inheriting instead of from a快译通,that contains类你可以在字典的创建。P></

如果我不打算这样做,我就不需要覆盖getattr和setattr了?在第一个示例中,我总是可以传递.get()的默认值。我不知道你第二点的例子是什么。

为了更清楚起见,编辑了第二个示例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值