这个问题的目的是了解“内置”是如何在python中内置的函数。
如果我重写setattr方法,我如何才能得到它?例如,我有这样的类“工作”:
class WorkingSetAttr:
def a(self): return 'a'
def b(self): return 'b'还有"NonWorking“这样的类:
class NonWorkingSetAttr:
def a(self): return 'a'
def b(self): return 'b'
def __setattr__(self,a,b): pass现在,我创建对象w和n,并运行以下命令:
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())产出如下:
w.a = b, w.b = b
n.a = a, n.b = b注意,n.a应该打印"b",但是它打印"a“,因为setattr不更改属性。
问题是:我应该如何修改对象n,使其像对象 w那样工作。注意,我指的是对象,而不是类。
发布于 2012-02-07 18:46:55
您只需从类对象中删除自定义__setattr__即可。
>>> 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:
>>> 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)
Truehttps://stackoverflow.com/questions/9181867
复制相似问题