在Python中,你可以调用类A的实例方法,但是传入一个B类的实例吗?

时间:2009-04-24 02:38:59

标签: python oop coding-style

为了重用一些被定义为不同类的实例方法的现有代码,我想要做类似以下的事情:

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实例)

这样的事情可能吗?


我应该清楚我知道这是一个坏主意。显然,真正的解决方案是一些重构。我只是觉得必须有一种方法,结果就是。

感谢您的评论。

4 个答案:

答案 0 :(得分:9)

看起来很有效:

Foo.hello.im_func(bar)
  

您好,我是Bar。

我想我需要更加努力地阅读this ......

答案 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总是关于鸭子打字,不是吗?!

参考文献:

Py2中的替代解决方案

请注意,这也是“探索性”的另一种解决方案。问题(见Python: Bind an Unbound Method?):

<function __main__.C.x>

价:

一些ipython代码示例

python 2

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

python 3

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中一样),但你不应该这样做。