解决这个问题的最佳方法是什么?
给定一个带有@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
答案 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__
。