动态地将方法/状态添加到在运行时

时间:2018-02-28 22:12:05

标签: python python-3.x

我需要动态添加一个类方法,该方法具有在运行时确定的名称,以及在运行时确定的内部状态。这是我可以做的最简单的例子:

class foo():
    pass

def h(self):   # h() is just a placeholder until we can do setattr()
    state = 'none'
    return state

setattr(h,'state','something')
setattr(foo,'bar',h)
del(h)

print(dir(foo))         # includes 'bar'
print(dir(foo.bar))     # includes 'state'
print(getattr(foo.bar,'state')) # 'something'

f = foo()
print(getattr(f.bar,'state'))    # 'something'

# all is well up to here, but now we go awry
print(f.bar())   # 'none'

在最后一行中,bar()return语句似乎绑定到h()中的原始定义,而不是foo中的新上下文。我尝试了很多东西,并在堆栈溢出中查看了内省和其他主题,但是空洞了。如何修改此代码,以便最后一行产生'某事'?

1 个答案:

答案 0 :(得分:0)

您在state中混淆了局部变量 h,这与函数对象h.state上的属性无关。它们不相关...注意,f.bar.state会给您'something'

你可以这样做:

In [6]: class Foo: pass

In [7]: def h(self):
   ...:     return self.state
   ...:

In [8]: Foo.bar = h

In [9]: f = Foo()

In [10]: f.state = 'something'

In [11]: f.bar()
Out[11]: 'something'