为了重用一些被定义为不同类的实例方法的现有代码,我想要做类似以下的事情:
class Foo(object):
def __init__(self):
self.name = "Foo"
def hello(self):
print "Hello, I am " + self.name + "."
class Bar(object):
def __init__(self):
self.name = "Bar"
bar = Bar()
Foo.hello(bar)
但结果是:
TypeError:必须使用Foo实例作为第一个参数调用未绑定方法hello()(改为使用Bar实例)
这样的事情可能吗?
我应该清楚我知道这是一个坏主意。显然,真正的解决方案是一些重构。我只是觉得必须有一种方法,结果就是。
感谢您的评论。
答案 0 :(得分:9)
答案 1 :(得分:5)
这是因为python将类函数包装为执行此类型检查的“未绑定方法”。对here中涉及的决策有一些描述。
请注意,此类型检查实际上已在python 3中删除(请参阅该文章末尾的注释),因此您的方法将在那里工作。
答案 2 :(得分:2)
这是一个老问题,但Python已经发展并且看起来值得指出:
使用Python 3,不再有style="background: url(/{{ your_object.your_img_field }}) no-repeat"
,因为未绑定的方法只是<unbound method C.x>
!
这可能意味着原始问题中的代码不应被视为/那/关。在任何情况下,Python总是关于鸭子打字,不是吗?!
请注意,这也是“探索性”的另一种解决方案。问题(见Python: Bind an Unbound Method?):
<function __main__.C.x>
价:
In [6]: a = A.a.im_func.__get__(B(), B)
In [7]: a
Out[7]: <bound method B.a of <__main__.B instance at 0x7f37d81a1ea8>>
In [8]: a(2)
2
In [1]: class A():
def a(self, a=0):
print a
...:
In [2]: A.a
Out[2]: <unbound method A.a>
In [3]: A.a.im_func
Out[3]: <function __main__.a>
In [4]: A.a(B())
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-7694121f3429> in <module>()
----> 1 A.a(B())
TypeError: unbound method a() must be called with A instance as first argument (got B instance instead)
答案 3 :(得分:0)
前段时间我想知道PerlMonks上Perl中的相同“功能”,而general consensus虽然它有效(就像在Python中一样),但你不应该这样做。