Python:允许子类重写父方法返回类型的首选方法?

Python:允许子类重写父方法返回类型的首选方法?,python,inheritance,Python,Inheritance,假设我有两门课: A类: 定义初始化(自): 数据=0 def副本(自我): 其他=A() other.data=self.data 返回其他 B(A)类: #B*不*覆盖A的“新”或“初始化”__ @类方法 来自_A(cls,A)的def: a、 _uuu类uuuu=cls 归还 a=a() b=b() B.来自A(A)#B的实例 b、 copy()#一个 从…开始,从…开始 当然,问题是B().copy()返回A的一个实例。我可以通过为B定义一个包装copy方法来绕过这个问题,也可以从A(

假设我有两门课:

A类:
定义初始化(自):
数据=0
def副本(自我):
其他=A()
other.data=self.data
返回其他
B(A)类:
#B*不*覆盖A的“新”或“初始化”__
@类方法
来自_A(cls,A)的def:
a、 _uuu类uuuu=cls
归还
a=a()
b=b()
B.来自A(A)#B的实例
b、 copy()#一个
从…开始,从…开始
当然,问题是
B().copy()
返回
A
的一个实例。我可以通过为
B
定义一个包装
copy
方法来绕过这个问题,也可以从A(B().copy())调用
B
。前一个选项需要包装所有此类方法;后一个选项感觉很危险,并引入了大量样板文件


有没有一种更标准的Pythonic方法可以做到这一点?我特别想问的是,在这种情况下,我无法访问
a
的实现,而相关的方法不是classmethods。举个具体的例子:我可以尝试将
pandas.DataFrame
子类化,并希望确保
B.copy()
B.merge(…)
返回
B
的实例,而不是
DataFrame

通常必须在
A.copy()
中完成此问题的一般解决方案——必须设计为允许子类化并返回适当的子类

不要在
copy()
方法中显式调用
A()
,调用对象的类构造函数

def copy(self):
    other = type(self)()
    other.data = self.data
    return other 

请注意,如果子类在其
\uuuu init\uuuu
方法中添加其他参数,则此操作将不起作用。

类似的操作可能会减少锅炉板:

B(A)类:
@类方法
来自_A(cls,A)的def:
a、 _uuu类uuuu=cls
归还
def wrap_方法(自身,方法):
out=getattr(self.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu类,方法)(self)
out.\uuuuu类\uuuuu=self.\uuuuu类__
返回
然后您必须调用
b.wrap\u方法('copy')
,而不是
b.from\u A(b.copy())
,它们都输出b的实例:

B.from_A(B.copy()),B.wrap_方法('copy'))
>>> (, )

您在这里指的是
A.copy
吗?问题是“我特别询问的是我无法访问A的实现的情况”我没有注意到问题的这一部分。谢谢,我看到了您随后的编辑。因此,如果
A
的设计不允许以这种方式进行子类化,您是运气不佳,还是有其他合理的选择?您可以尝试使用
copy.deepcopy()
,但我不认为有一个真正通用的解决方案,因为复制的本质通常是特定于类的。我在OP中以复制为例,但我感兴趣的是处理几个方法,所有这些方法都返回一个新的
a
实例。我将对此进行澄清