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
实例。我将对此进行澄清