首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何取消重写__setattr__方法?

如何取消重写__setattr__方法?
EN

Stack Overflow用户
提问于 2012-02-07 18:38:07
回答 1查看 1.1K关注 0票数 0

这个问题的目的是了解“内置”是如何在python中内置的函数。

如果我重写setattr方法,我如何才能得到它?例如,我有这样的类“工作”:

代码语言:javascript
复制
class WorkingSetAttr:
    def a(self): return 'a'
    def b(self): return 'b'

还有"NonWorking“这样的类:

代码语言:javascript
复制
class NonWorkingSetAttr: 
    def a(self): return 'a'
    def b(self): return 'b'
    def __setattr__(self,a,b): pass

现在,我创建对象w和n,并运行以下命令:

代码语言:javascript
复制
w = WorkingSetAttr()
setattr(w,'a',w.b)
print "w.a = %s, w.b = %s" % (w.a(), w.b())

n = NonWorkingSetAttr()
setattr(n, 'a', n.b)
print "n.a = %s, n.b = %s" % (n.a(), n.b())

产出如下:

代码语言:javascript
复制
w.a = b, w.b = b
n.a = a, n.b = b

注意,n.a应该打印"b",但是它打印"a“,因为setattr不更改属性。

问题是:我应该如何修改对象n,使其像对象 w那样工作。注意,我指的是对象,而不是类。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-07 18:46:55

您只需从类对象中删除自定义__setattr__即可。

代码语言:javascript
复制
>>> n = NonWorkingSetAttr()
>>> setattr(n, 'a', n.b)
>>> print("n.a = %s, n.b = %s" % (n.a(), n.b()))
n.a = a, n.b = b
>>> 
>>> del NonWorkingSetAttr.__setattr__
>>>
>>> setattr(n, 'a', n.b)
>>> print("n.a = %s, n.b = %s" % (n.a(), n.b()))
n.a = b, n.b = b

注意,这会修改类,而不是对象。您(几乎可以肯定)不想修改对象本身,因为这样您就有了一个看起来应该是NonWorkingSetAttr的对象,但实际上它是某种您并不真正理解的动态事物。

如果无法修改类,则只需创建一个子类并用object重写object

代码语言:javascript
复制
>>> class FixedNonWorkingSetAttr(NonWorkingSetAttr):
...     __setattr__ = object.__setattr__
... 
>>> n = FixedNonWorkingSetAttr()
>>> setattr(n, 'a', n.b)
>>> print("n.a = %s, n.b = %s" % (n.a(), n.b()))
n.a = b, n.b = b
>>> isinstance(n, NonWorkingSetAttr)
True
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9181867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档