classmethod作为构造函数和继承

时间:2014-01-04 18:44:50

标签: python inheritance constructor class-design

问题很简单。如果类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>

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案是让类B的{​​{1}}方法具有其__init__参数的默认值。这将使b cls(a)调用在继承时有效。如果使用默认值,则A.from_csv方法可以计算要存储的值__init__(就像现在在a中一样)。

B.from_csv

答案 1 :(得分:0)

做了一些不同的试验。我的结论是你应该覆盖classmethod而不重用里面的代码。因此,对于我的特定问题,我发现的最佳方法是尽可能简单地使classmethod并在我的情况下将我想要重用的代码放在另一个方法static中,因为classmethod是构造函数。