【发布时间】:2012-02-07 18:38:07
【问题描述】:
这个问题的目的是了解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
请注意,n.a 应该打印“b”,但它会打印“a”,因为 setattr 不会更改属性。
问题是:我应该如何修改 object n 使其像 object w 一样工作。请注意,我的意思是对象,而不是类。
【问题讨论】:
-
修改对象而不修改它们的类(几乎)总是一个坏主意。毕竟,实例意味着是特定类的实例!如果你打破这种关系,你最终会得到一些你不太了解并且无法调试的“事物”。
-
@KevinDTimm Python 内置方法
setattr设置了一个属性,该属性又调用了类对象上的__setattr__。 -
__setattr__从 setattr 调用。看看它在“w”的情况下是如何工作的(输出从“a”变为“b”)。重点是:如果我只是“破坏”了内置函数,我该如何取回它。 -
由于您使用的是 Python 2.x,因此您的类都应该继承自
object。 (一方面,这使得如何取消覆盖您的方法变得更加明显:只需将其重置为默认的__setattr__,它继承自object。)
标签: python class object dynamic setattr