将对象包装到派生类中

时间:2014-10-05 03:44:43

标签: python python-2.7 inheritance

假设我有一个来自第三方库的A类(仅供参考,它是numpy.matrix)。我想用包装类B扩展它的公共接口。

class B(A):
    def myMethod(self,arg):
        return 'spam'

而且,我想从A对象创建B对象。由于B不会再保留任何属性,我只是想要返回A对象,具有B行为:

class B(A):
    def __new__(cls,a): # type(a)==A
        return a.castTo(B) # pseudo-code

有没有办法在python中做到这一点?

类似地,有没有办法将B对象转换为A对象?

1 个答案:

答案 0 :(得分:1)

您的B班__new__需要致电A __new__。这是使用内置list类的简短演示。

class mylist(list):
    def __new__(cls, obj=None):
        return list.__new__(cls, obj)

    def mymethod(self, msg):
        print msg, id(self)


def main():
    a = mylist('abc')
    print a, id(a)
    a.mymethod('hello')


if __name__ == '__main__':
    main()

如果您只想将一个简单的函数添加到现有类的实例中,您可以执行此类操作。

class A(object):
    pass

def silly(arg=None):
    print 'This is silly', arg

b = A()
b.my = silly
b.my()

请注意b.my它只是一个函数,而不是一个方法,所以当你调用它时,会自我传递。但你可以通过b.my(b)

“手动”传递它

修改

作为撰写list.__new__(cls, obj)的替代方法,您可以调用super()函数:

def __new__(cls, obj=None):
    return super(mylist, cls).__new__(cls, obj)

但在大多数情况下,使用基类名称更清晰,更短。我想可能是一个偏好super()的理由,但我还不足以说明这个问题。 :)