在python中使用基类classmethod实例化派生类对象

时间:2016-03-27 12:33:38

标签: python

我有一个类如下的基类:

class Base(object):
    def __init__(self, arg1, arg2):
        #Declare self
        self.arg1 = arg1
        self.arg2 = arg2

    @classmethod
    def from_ini_file(cls, f):
        # Get arg1 and arg2 from ini file
        return cls(arg1, arg2)

然后我希望能够在派生类中使用classmethod构造函数。天真的,我试过了:

class Derived(Base):
    def __init__(self):
        f = 'default.ini'
        Base.from_ini_file(f)

但这不起作用。我想我明白为什么这不起作用,但如果可能的话,我还无法弄清楚如何正确地做到这一点。

感谢您的帮助。

修改

这感觉非常不优雅但我现在正在使用:

class Derived(Base):
    def __init__(self):
        t = Base.from_ini_file('default.ini')
        Base.__init__(t.arg1, t.arg2)

这里有很多冗余操作,我不喜欢必须拥有Base的参数。 init 函数必须保存到对象中以这种方式使用。所以我全力以赴寻求更好的解决方案。再次感谢。

2 个答案:

答案 0 :(得分:1)

from_ini_file返回一个新实例,因此您必须从派生类调用此方法,同时形成一个classmethod:

class Derived(Base):
    @classmethod
    def from_default_ini(cls):
        f = 'default.ini'
        return cls.from_ini_file(f)

答案 1 :(得分:0)

我知道这太旧了,我确定你已经继续前进了,但我想我会分享我如何实现类似的东西

class Base(object):
    def __init__(self, arg1, arg2):
        #Declare self
        self.arg1 = arg1
        self.arg2 = arg2

    @staticmethod
    def from_ini_file(f):
        # Get arg1 and arg2 from ini file
        return Base(arg1, arg2)
myInstance = Base.from_ini_file(f)

如果你想完全隐藏 ini 文件:

class Derived(Base):
    def __init__(self, f='default.ini'):
        # Get arg1 and arg2 from ini file
        super().__init__(arg1, arg2)
defaultInstance = Derived()
customInstance = Derived(customF)