问题很简单。如果类B
继承了类A
并想要覆盖用作构造函数的'classmethod'(我想你称之为“工厂方法”)。问题是B.classmethod
会想要重用A.classmethod
,但是它必须创建一个A类的实例,而它是A类的子类 - 因为,作为一个类方法,它没有自我。 然后,它似乎不是设计它的正确方法。
我做的例子很简单,我通过阅读numpy数组等做了更复杂的事情。但我想这里没有信息丢失。
class A:
def __init__(self, a):
self.el1 = a
@classmethod
def from_csv(cls, csv_file):
a = read_csv(csv_file)
return cls(a)
@classmethod
def from_hdf5 ...
class B(A):
def __init__(self, a, b)
A.(self, a)
self.el2 = b
@classmethod
def from_csv(cls, csv_file):
A_ = A.from_csv(csv_file) #instance of A created in B(A)
b = [a_*2 for a_ in A.el]
return cls(A.el, b)
有没有一种pythonic方式来处理它?</ p>
答案 0 :(得分:1)
一个简单的解决方案是让类B
的{{1}}方法具有其__init__
参数的默认值。这将使b
cls(a)
调用在继承时有效。如果使用默认值,则A.from_csv
方法可以计算要存储的值__init__
(就像现在在a
中一样)。
B.from_csv
答案 1 :(得分:0)
做了一些不同的试验。我的结论是你应该覆盖classmethod
而不重用里面的代码。因此,对于我的特定问题,我发现的最佳方法是尽可能简单地使classmethod
并在我的情况下将我想要重用的代码放在另一个方法static
中,因为classmethod是构造函数。