鉴于两个不相关的类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'
答案 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不强制传递同一个类。
在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
的属性,它引用实例方法调用的实际函数,没有实例/类绑定。类对象的方法版本也具有此属性。