__init__ 在重写的类方法中

问题描述 投票:0回答:2

我有一个小的类层次结构,具有类似的方法和

__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 对象。如何更改代码以便返回正确类的对象?

python class-method
2个回答
0
投票

您应该使用

super()
而不是
cls.__base__
来调用具有当前类绑定的父类的方法。

改变:

return cls.__base__.read(fname0)

至:

return super().read(fname0)

0
投票

原因:

您返回

__base__.read(...)
# 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'))
© www.soinside.com 2019 - 2024. All rights reserved.