2 python
它是类A的对象,在容器的类tmpA中.并非所有来自A的方法都在tmpA中.因此,例如:存在A + B,不存在tmpA + B. 我尝试从A调用tmpA的方法.我可以调用简单的方法,例如change(),但是__add__- 不起作用.如果要从对象中删除继承,代码可以正常工作.
#--------------------------------------
class A(object):
def __init__( self, x, y ):
self.x = x
self.y = y
pass
#-------
def __add__( self, arg ):
tmp1 = self.x + arg.x
tmp2 = self.y + arg.y
return tmpA( A( tmp1, tmp2 ) )
def change( self, x, y ):
self.x = x
self.y = y
pass
pass
#------------------------------------------
class tmpA( object ):
def __init__( self, theA ):
self.A = theA
pass
#-------
def _print ( self ):
print " x =", self.A.x
print " y =", self.A.y
pass
#-------
def __call__( self ):
return self.A
#-------
def __coerce__( self, *args ):
return None
#-------
def __getattr__( self, *args ):
name = args[ 0 ]
try:
attr = None
exec "attr = self.__call__().%s" % name
return attr
except :
raise AttributeError
#--------------------------------------
class B( object ):
def __init__( self, x, y):
self.x = x
self.y = y
pass
#-------------------------------------
a=A( 1,2 );
b=B( 3,4 );
tmp_a = a + b;
tmp_a.change( 0, 0 ) # very well
v = tmp_a + b #TypeError: "unsupported operand type(s) for +: 'tmpA' and 'B'"
Run Code Online (Sandbox Code Playgroud)
在类上查找特殊方法,即不在类的实例上(除了旧式类中的一些不规则之外,这只是一个非常令人头疼的问题).因此,特别是类的__getattr__(对于理智的,新式的类)在执行时不会被调用查找- 元类(在此处)是.__add__+type__getattr__
"从中删除继承object"意味着重新回到旧式课程的hellzapoppin世界,只会存储未来的痛苦:不要!相反,如果你有一个必须委托一些特殊方法的类,在类中直接或通过类装饰器显式编写它们,或者创建一个知道这个怪癖的自定义元类(元类__getattr__或其他方法,然后可以执行)你渴望的任务).