将方法应用于另一个类的对象

时间:2012-03-12 08:35:24

标签: python

鉴于两个不相关的类A和B,如何使用B的对象A.method调用self

class A:
    def __init__(self, x):
        self.x = x

    def print_x(self):
        print self.x

class B:
    def __init__(self, x):
        self.x = x

a = A('spam')
b = B('eggs')

a.print_x() #<-- spam
<magic>(A.print_x, b) #<-- 'eggs'

3 个答案:

答案 0 :(得分:9)

在Python 3.x中,你可以简单地做你想做的事:

A.print_x(b) #<-- 'eggs'

如果你只有一个'A'的实例,那么首先得到这个类:

a.__class__.print_x(b) #<-- 'eggs'

在Python 2.x(OP使用的)中,这不起作用,如OP所述并在评论中由Amber解释:

  

这是Python 2.x和Python 3.x之间的区别    3.x不强制传递同一个类。

更多细节(OP编辑)

在python 2中,A.print_x返回一个“未绑定的方法”,不能直接应用于其他类的对象:

  

当调用未绑定的用户定义方法对象时,将调用基础函数(im_func),并限制第一个参数必须是正确类(im_class)或其派生类的实例。 &GT;&GT; http://docs.python.org/reference/datamodel.html

要解决此限制,我们首先必须通过im_func__func__(2.6+)从方法获取“原始”函数,然后可以将其称为传递对象。这适用于类和实例:

# python 2.5-
A.print_x.im_func(b)    
a.print_x.im_func(b)

# python 2.6+
A.print_x.__func__(b)   
a.print_x.__func__(b)

在python 3中,没有这种东西作为未绑定的方法。

  

未绑定的方法已经不复存在了。 ClassObject.method返回一个   普通的函数对象,instance.method仍然返回一个绑定   方法对象。 &GT;&GT; http://www.python.org/getit/releases/3.0/NEWS.txt

因此,在python 3中,A.print_x只是一个函数,可以立即调用,a.print_x仍然必须是无界的:

# python 3.0+
A.print_x(b)
a.print_x.__func__(b)

答案 1 :(得分:4)

你没有(嗯,并不是你不能投入足够的魔法让它发挥作用,这是你不应该)。如果该函数适用于多种类型,请将其设为...函数。

# behold, the magic and power of duck typing
def fun(obj):
    print obj.x

class A:
    x = 42

class B:
    x = 69

fun(A())
fun(B())

答案 2 :(得分:2)

我不知道为什么你真的想要这样做,但 可能

>>> class A(object):
...     def foo(self):
...         print self.a
...
>>> class B(object):
...     def __init__(self):
...         self.a = "b"
...
>>> x = A()
>>> y = B()
>>> x.foo.im_func(y)
b
>>> A.foo.im_func(y)
b

实例方法(类实例的绑定方法)有一个名为im_func的属性,它引用实例方法调用的实际函数,没有实例/类绑定。类对象的方法版本也具有此属性。