gpt4 book ai didi

python - 将对象包装到派生类中

转载 作者:太空宇宙 更新时间:2023-11-04 05:58:54 25 4
gpt4 key购买 nike

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

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 对象?

最佳答案

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 它只是一个函数,而不是一个方法,因此当您调用它时,它不会 self 传递。但是您可以通过执行 b.my(b)

“手动”传递它

编辑

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

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

但在大多数情况下,使用基类名称会更清晰、更简短。我猜想 可能 是更喜欢 super() 的原因,但我不是这方面的专家可以说。 :)

关于python - 将对象包装到派生类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26199430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com