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
    评论
在提供的代码,`__setattr__`方法被重写为`dict.__setitem__`,这意味着当我们给对象的属性赋值时,实际上是调用了`dict.__setitem__`方法来设置字典的键值对。这样做的目的是为了让对象支持通过点操作符来设置属性,使得对象可以像访问属性一样访问字典的键值对。这种做法在某些情况下可以提供更直观和方便的使用方式。 除了`__setattr__`方法外,还有`__getattr__`和`__delattr__`方法。`__getattr__`方法被重写为`dict.get`方法,当属性不存在时,会返回None,而不是抛出AttributeError异常。`__setattr__`方法被重写为`dict.__setitem__`,用于设置属性值。`__delattr__`方法被重写为`dict.__delitem__`,用于删除属性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python对象和字典dict的相互转化【点.和[属性]】的访问区别及特殊方法名总结](https://blog.csdn.net/weixin_43343144/article/details/92764884)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python字典转对象的两种方法(dict -> object使属性用点来调用)](https://blog.csdn.net/qq_21567385/article/details/107990864)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [python内置函数__getattr__、__serattr__、__delattr__与字典dict的使用](https://blog.csdn.net/SL1029_/article/details/129638430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值