使用父类,但覆盖“子类数据”

时间:2019-12-07 00:12:05

标签: python python-3.x oop inheritance

我正在尝试添加具有from_dictto_dict方法的基类。这是我到目前为止的内容:

class Base:
    def __init__(self, **kwargs):
        for k,v in kwargs.items():
            setattr(self, k, v)
    @classmethod
    def from_dict(cls, d):
        return Base(**d)
    def to_dict(self):
        d = dict()
        for k,v in self.__dict__.items():
            if k.startswith('_'): continue # remove fields that start with '_'
            d[k] = v
        return d


class Item(Base):
    def __init__(self, **kwargs):
        self.name = kwargs.get('name')
        self.age = kwargs.get('age')
        self._nombre = kwargs.get('_nombre')
        self.other = 'hello!'
        super().__init__(**self.__dict__)

以下是其用法的一些示例:

>>> Item().to_dict()
{'name': None, 'age': None, 'other': 'hello!'}

>>> Item.from_dict({'age':12}).to_dict()
{'age': 12} # I want this to also have `name` and `other` keys.

请注意,当我使用from_dict时,它没有填写子类的默认值。将方法添加到Item时有效:

class Item(Base):
    def __init__(self, **kwargs):
        self.name = kwargs.get('name')
        self.age = kwargs.get('age')
        self._nombre = kwargs.get('_nombre')
        self.other = 'hello!'
        super().__init__(**self.__dict__)
    @classmethod
    def from_dict(cls, d):
        return Item(**d)    

但是我如何让它生活在父Base类中?如果不可能,那么最“ Python式”的方法是什么(一个Mixin?)?

1 个答案:

答案 0 :(得分:0)

您将to_dict()用作类方法,但事实并非如此。将其设置为类方法,或调用Item构造函数以获取实例并调用其方法。