多重継承の代わりにミックスインコンポーネントの使用を検討してください

Pythonはオブジェクト指向プログラミング言語であり、開発者が多重継承を適切に実装できるように、いくつかの組み込みプログラミングメカニズムを提供します。ただし、多重継承を回避するように努める必要があります。

多重継承がもたらす便利さとカプセル化を利用する必要がある場合は、min-inクラスの作成を検討してください。Min-inは小さなクラスであり、独自の属性を定義せずに、他のクラスが提供する必要のある一連の追加メソッドのみを定義します。さらに、ユーザーが独自の__init__コンストラクターを呼び出す必要はありません。

min-inの最大の利点は、ユーザーがこれらの共通機能をいつでも挿入し、必要に応じて上書きできることです。複数のmin-inを直接組み合わせることができます。このようなmin-inを使用すると、継承システムを介して関連するツールクラスを簡単に作成するために、ごく少量のコードを記述するだけで済みます。

キーポイント:

1. min-inコンポーネントを使用できる場合は、多重継承を使用しないでください。

2.各関数をプラグ可能なmin-inコンポーネントとして実装し、それを継承します。

3.単純な動作をmin-inコンポーネントにカプセル化すると、複数のmin-inを使用して複雑な動作を組み合わせることができます。

 

たとえば、Pythonインスタンスオブジェクトをシリアル化するために辞書として出力する必要があります。この関数は、他のクラスが使用する一般的なコードとして記述した方がよいでしょう。

class ToDictMixin(object):
    def to_dict(self):
        return self._traverse_dict(self.__dict__)

    def _traverse_dict(self, instance_dict):
        output = {}
        for key, value in instance_dict.items():
            output[key] = self._traverse(key, value)
        return output

    def _traverse(self, key, value):
        if isinstance(value, ToDictMixin):
            return value.to_dict()
        elif isinstance(value, dict):
            return self._traverse_dict(value)
        elif isinstance(value, list):
            return [self._traverse(key, i) for i in value]
        elif hasattr(value, '__dict__'):
            return self._traverse_dict(value.__dict__)
        else:
            return value

別の例として、任意のクラスに一般的なJSONシリアル化関数を提供できるmin-inを作成できます。min-inを継承するクラスは、to_dictという名前のメソッドを提供すると想定できます。

class JsonMixin(object):
    @classmethod
    def from_json(cls, data):
        kwargs = json.loads(data)
        return cls(**kwargs)

    def to_json(self):
        return json.dumps(self.to_dict())

 次に、拡張関数の役割を実現するために、テストクラスを定義し、上記の2つのmin-inを同時に継承します。

class Person(ToDictMixin, JsonMixin):
    def __init__(self, name, age, address, list1, dict1):
        self.name = name
        self.age = age
        self.address = address
        self.list1 = list1
        self.dict1 = dict1

    def introduce(self):
        print(f'{self.name} {self.age} {self.address}')

テスト実行結果:

if __name__ == '__main__':
    # 1.测试ToDictMixin
    person = Person('zhangsan', 18, 'Shenzhen', [1, 2, 3], {'username': 'admin', 'password': '123456'})
    print(person.to_dict())

    # 2.测试JsonMixin
    json_str = '{"name": "zhangsan", "age": 18, "address": "Shenzhen", "list1": [1, 2, 3], "dict1": {"username": "admin", "password": "123456"}}'
    person = Person.from_json(data=json_str)
    json_str = person.to_json()
    print(json_str)

演算結果:

操作の結果は、Personクラスがmin-inによって正常に拡張され、新しい関数が追加されたことを示しています。Pythonインスタンスオブジェクトを辞書の形式で出力し、PythonインスタンスオブジェクトをJSON文字列の形式で出力します。 。

おすすめ

転載: blog.csdn.net/zhu6201976/article/details/109328682