【问题标题】:Method namespaces/collections in Python classesPython 类中的方法命名空间/集合
【发布时间】:2014-03-24 12:34:12
【问题描述】:

假设我有一个课程Foo,我有一个foo = Foo()。我想要某种“方法命名空间”foo.bar,它不会在Foo 实例之间共享,我可以动态添加在foo 上运行的方法:

def method(self, someValue):
    self.value = someValue + 10

foo.bar.m = method
foo.bar.m(20)

然后我想找到foo.value 是 30。

有什么方法可以做到这一点?

【问题讨论】:

  • 我不明白。您的目标是修改 foo.valueFoo 的某些(但不是全部)实例?
  • 我希望 self 中的 method 在被称为 foo.bar.m(someInt) 时引用 foo

标签: python class methods namespaces


【解决方案1】:

这就是你要找的吗?

import types

class Namespace(object):
    pass

class Foo(object):
    def __init__(self, value):
        self.value = value
        self.bar = Namespace()

def function(self, new_value):
    self.value = new_value

a = Foo(1)
b = Foo(2)

b.bar.function = types.MethodType(function, b, Foo)
b.bar.function(6)

print a.value   # prints 1
print b.value   # prints 6

诀窍是使用types 模块将测试函数转换为可以绑定到对象实例的方法。

当我运行这行代码:b.bar.function = types.MethodType(function, b, Foo) 时,我实际上是在告诉 Python 创建一个新方法,将 function 绑定到 Foob 实例。然后我可以采用这种方法并将其存储在任意位置。

由于该方法永久绑定到Foob 实例,因此self 将始终引用b,无论该方法实际分配给哪个对象。

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 2018-07-02
    • 2014-05-18
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2013-05-17
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多