class A(object):
def a(self, b=1):
print 'Up'
d = {1 : a}
def b( self ):
print self.d[1]
print self.b
print self.d[1].__get__( self, A )()
# print self.d[1]()
class B( object ):
def a( self ):
print 'here??'
return 10000
d = {1 : a}
def b( self ):
print 'hurray'
o = A()
o.b()
b = B()
type( o ).__dict__['b'].__get__( b, type( b ) )()
嗨伙计,
我正在经历Python: Bind an Unbound Method?和http://users.rcn.com/python/download/Descriptor.htm并试图尝试我的学习。
但是,我现在遇到了一些新的疑虑: -
__get__
与b
对象和实例type(b)
一起使用。这仅适用于b
中定义方法class B
的情况。为什么会这样?b
中提供方法class B
,仍然会调用b
中的方法class A
。为什么会这样?a
的{{1}}方法未被class A
的方法代码调用b
;相反,它调用class A
的方法a
。为什么会这样?答案 0 :(得分:2)
在我的代码的最后一行,我可以将
__get__
与b对象和实例type(b)
一起使用。这仅适用于b
中定义方法class B
的情况。为什么会这样?
您必须在班级b
中定义方法B
,因为在A.b
中您有print self.b
。这里,self
是B类的一个实例,因此self.b
表示“属于此b
的{{1}}方法”,而不是“属于B
方法”这个方法存在于“。如果您删除b
,则即使print self.b
没有B
,代码也会有效。
正在调用即使最后一行要求我在
b
中提供方法b
,仍然会调用class B
中的方法b
。为什么会这样?
class A
,因为您使用A.b
明确访问它。是否将该方法绑定到A实例或B实例无关紧要;它仍然是type( o ).__dict__['b']
。
令我完全惊讶的是,在上述步骤之后,我注意到
A.b
的{{1}}方法未被a
的方法代码调用class A
;相反,它调用b
的方法class A
。为什么会这样?
即使a
属于类class B
,您传递给它的b
仍然是A
类的实例。您在self
上访问的任何属性都将是B
属性,您调用的任何方法都是self
方法。