【问题标题】:access object members from dynamically added methods in python从python中动态添加的方法访问对象成员
【发布时间】:2015-11-09 08:22:20
【问题描述】:

我在使用动态生成的方法共享类成员时遇到问题。

例如,从__init__normal_test 访问的x 与从动态有界方法testsetx 访问的x 不同:

class Foo:
    def __init__(self):
        self.x = 10
    def normal_test(self):
        print self.x

def bar(self):
    print self.x
def setx_method(self,x):
    self.x = x

setattr(Foo, "test", classmethod(bar))
setattr(Foo, "setx", classmethod(setx_method))

f = Foo();
f.setx(5)
f.test()
f.normal_test()

我应该如何编写代码以使self.x 引用相同的x

【问题讨论】:

    标签: python reflection metaprogramming


    【解决方案1】:

    分析

    setattr(Foo, "setx", classmethod(setx_method))
    

    相当于

    @classmethod
    def setx_method(self,x):
        self.x=x
    

    现在当你调用f.setx(5) 时,它实际上将fclass(ie, Foo) 与self 和5 与x 绑定,因此它执行Foo.x = 5

    简而言之,Foo 中有两个x,一个是实例成员x,一个是类成员x

    f.setx(5)        # sets class x
    f.test()         # print class variable x
    f.normal_test()  # print instance variable x
    

    【讨论】:

    • 谢谢 我没明白在类上设置属性方法实际上定义了一个方法..不需要类方法。
    【解决方案2】:

    您不应该将@classmethodself 一起使用,因为它指向您的类实例,而在@classmethod 中您应该使用cls,因为它指向整个类。

    请看这里:Meaning of @classmethod and @staticmethod for beginner?


    所以最简单的解决方案就是删除classmethod

    setattr(Foo, "test", bar)
    setattr(Foo, "setx", setx_method)
    

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2011-11-21
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多