假设我有一个来自第三方库的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对象?
答案 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()
的理由,但我还不足以说明这个问题。 :)