0

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

如果我覆盖 setattr 方法,我该如何取回它?例如,我有这样的“工作”类:

class WorkingSetAttr:
    def a(self): return 'a'
    def b(self): return 'b'

和这样的“非工作”类:

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

请注意,na 应该打印“b”,但它会打印“a”,因为 setattr 不会更改属性。

问题是:我应该如何修改对象n 以便它像对象w 一样工作。请注意,我的意思是对象,而不是类。

4

1 回答 1

1

您可以__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

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

如果你不能修改类,你可以创建一个子类并__setattr__object's 重新覆盖:

>>> 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
于 2012-02-07T18:46:55.643 回答