将方法绑定到另一个类

时间:2014-04-28 13:24:05

标签: python object descriptor

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并试图尝试我的学习。

但是,我现在遇到了一些新的疑虑: -

  1. 在我的代码的最后一行,我能够将__get__b对象和实例type(b)一起使用。这仅适用于b中定义方法class B的情况。为什么会这样?
  2. 即使最后一行要求我在b中提供方法class B,仍然会调用b中的方法class A。为什么会这样?
  3. 令我完全惊讶的是,经过上述步骤后,我注意到a的{​​{1}}方法未被class A的方法代码调用b;相反,它调用class A的方法a。为什么会这样?
  4. 看到这种行为后,我很困惑。我可能还需要了解有关描述符的更多信息。但是,如果你能回答我的怀疑,这将是一个很大的帮助

1 个答案:

答案 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方法。