我有一个小的类层次结构,具有类似的方法和
__init__()
,但静态(类)read()
方法略有不同。具体来说,子类在读取之前是否需要准备一下文件名(但读取本身是相同的):
class Foo:
def __init__(self, pars):
self.pars = pars
@classmethod
def read(cls, fname):
pars = some_method_to_read_the_file(fname)
return cls(pars)
class Bar(Foo):
@classmethod
def read(cls, fname):
fname0 = somehow_prepare_filename(fname)
return cls.__base__.read(fname0)
这里的问题是
Bar.read(…)
返回一个 Foo 对象,而不是 Bar 对象。如何更改代码以便返回正确类的对象?
您应该使用
super()
而不是 cls.__base__
来调用具有当前类绑定的父类的方法。
改变:
return cls.__base__.read(fname0)
至:
return super().read(fname0)
原因:
您返回
# read 方法的结果,但您应该返回新实例__base__.read(...)
这是一个例子:
class Foo:
def __init__(self, pars):
self.pars = pars
@classmethod
def read(cls, fname):
pars = [1, 2]
return cls(pars)
class Bar(Foo):
@classmethod
def read(cls, fname):
fname0 = [3, 4]
return cls(fname0)
print(Bar.read('test'))