假设有一个类
A
和一个工厂函数 make_A
。
class A():
...
def make_A(*args, **kwars):
# returns an object of type A
这两个名称都定义在some_package
中。
同时假设我想通过子类化来扩展A
的功能,但又不想重写构造函数:
from some_package import A, make_A
class B(A):
def extra_method(self, ...):
# adds extra functionality
我还需要编写一个新的工厂函数make_B
来创建子类B
。
到目前为止,我找到的解决方案是
def make_B(*args, **kwargs):
"""
same as make_A except that it returns an object of type B
"""
out = make_A(*args, **kwargs)
out.__class__ = B
return out
这个方法看起来可以工作,但我有一些担心,因为直接修改__class__
属性感觉像是一种hack。我也担心这种修改可能会导致意想不到的副作用。这是推荐的解决方案吗?还是有更"清晰"的模式来达到相同的结果?
B
添加一个构造函数,它接受一个对象A
,然后只需out = B(make_A(*args, **kwargs))
? - Alexey LarionovB.__init__
函数是从A
继承而来的,并且B
没有覆盖它,因此您可以简单地修改make
函数以返回初始化参数而不是实例本身。 - Miquel EscobarB
中添加构造函数吗? - Alexey LarionovB
添加一个构造函数,但我不想覆盖__init__
,因为我希望保持B
的接口尽可能接近A
。 - zap