在另一个Python类中使用无绑定方法

3 投票
2 回答
1764 浏览
提问于 2025-04-16 15:57

我有一个没有绑定到任何对象的方法,叫做 <unbound method foo.ops>,我想在另一个类中使用这个方法。举个例子:

class foo2(object):
  pass

foo2.ops = foo.ops

但是

obj = foo2()
obj.ops()

raises TypeError: unbound method ops() must be called with foo instance as first argument (got nothing instead)

2 个回答

0

如果你想实现“类方法”,那么你应该直接调用它,而不需要创建对象实例。

class foo:
    @staticmethod
    def ops(name):
        print "Hi there",name

foo.ops("Peter")

class foo2:
    pass

foo2.ops = staticmethod(foo.ops)

foo2.ops('aa')

(这段内容是从 http://code.activestate.com/recipes/52304-static-methods-aka-class-methods-in-python/ 复制过来的)

如果你想要实例方法,可以使用继承。

11

如果你想把同一个方法添加到几个没有关系的类里(比如做面向切面编程),不要直接从其中一个类复制一个不绑定的方法。相反,你应该定义一个普通的函数,然后把它作为方法分配给每个类。

通常,更好的做法是使用混入(就是普通的继承)或者元类(类装饰器的语法看起来很不错)。

如果你真的想从一个你无法控制的类里偷一个方法,你可以从“不绑定的方法”包装器中提取出来:foo2.ops.im_func;这其实是一个普通的函数,你可以把它作为方法分配给另一个类。

撰写回答