带有classmethod构造函数的Pythonic超类:override,inherit,...?

时间:2016-10-04 08:02:15

标签: python inheritance class-method

解决这个问题的最佳方法是什么?

给定一个带有@classmethod构造函数的类,例如代码示例1.但现在将它子类化为两个类,这两个类都需要一个完全不同的附加参数,例如在代码示例2中。这应该通过使用来解决*args, **kwargs(样本3)?或者我应该继承@classmethod而不是在每个班级复制它?或者创建一个超类def read_csv并从子类中引用' @classmethod

子类化是必不可少的,因为类中还有其他复杂的函数。

使用此代码的其他人应该了解在初始化各个类时要传递的参数。

代码示例1

class Car(object):
    @classmethod
    def from_csv(cls, csv):
       df = pd.read_csv(csv)
       # could be more complex
       return cls(df)

    def __init__(self, df):
        self.df = df

代码示例2

class Ferrari(Car):
    def __init__(self, df, ferrari_logo):
        self.df = df
        self.ferrari_logo = ferrari_logo

    def somethingcomplex(self):
        #complex ferrari method

def Fiat(Car):
    def __init__(self, df, fiat_wheels):
        self.df = df
        self.fiat_wheels = fiat_wheels

    def somethingcomplex(self):
        #complex fiat method

Fiat.from_csv('fiat.csv', fiat_wheels=8)
Ferrari.from_csv('ferrari.csv', ferrari_logo='logo.jpg')

代码示例3

class Car(object):
    @classmethod
    def from_csv(cls, csv, *args, **kwargs):
       df = pd.read_csv(csv)
       # could be more complex
       return cls(df, *args, **kwargs)

    def __init__(self, df):
        self.df = df

1 个答案:

答案 0 :(得分:1)

我认为每次通过设置Car类的新属性时,您都可以避免定义新的子类(以及子类化)从kwargs传递给类的__init__方法的每个实例的属性:

class Car(object):
    @classmethod
    def from_csv(cls, csv, **kwargs):
        df = pd.read_csv(csv)
        # could be more complex
        return cls(df, **kwargs)

    def __init__(self, df=None, **kwargs):
        self.df = df
        for kw in kwargs:
            setattr(self, kw, kwargs[kw])

然后你可以这样做:

ferrari = Car.from_csv('some.csv', name='ferrari', ferrari_logo='logo.jpg')
fiat = Car.from_csv('fiat.csv', name='fiat', fiat_wheels=8)

<强>更新

如果需要在子类级别定义单独的方法,则可以继承上述内容。您不需要为每个子类编写单独的__init__