Hướng dẫn python mixin best practices - các phương pháp hay nhất về python mixin

Tóm tắt: Trong hướng dẫn này, bạn sẽ tìm hiểu về các lớp Python Mixin và cách sử dụng chúng để làm cho mã có thể tái sử dụng.: in this tutorial, you’ll learn about Python mixin classes and how to use them to make the code reusable.

Mixin trong Python là gì

Mixin là một lớp cung cấp việc triển khai phương pháp để tái sử dụng bởi nhiều lớp con liên quan. Tuy nhiên, thừa kế không ngụ ý mối quan hệ IS-A.

Một mixin không định nghĩa một loại mới. Do đó, nó không nhằm mục đích khởi tạo hướng.

Một mixin gói một bộ phương pháp để tái sử dụng. Mỗi mixin nên có một hành vi cụ thể duy nhất, thực hiện các phương pháp liên quan chặt chẽ.

Thông thường, một lớp con sử dụng nhiều kế thừa để kết hợp các lớp mixin với lớp cha.

Vì Python không định nghĩa một cách chính thức để xác định các lớp mixin, nên nó là một thực tế tốt để đặt tên cho các lớp mixin với hậu tố

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)3.

Một lớp mixin giống như một giao diện trong Java và C# với việc triển khai. Và nó giống như một đặc điểm trong PHP.

Ví dụ về hỗn hợp Python

Đầu tiên, xác định một lớp

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)4:

class Person: def __init__(self, name): self.name = name

Code language: Python (python)

Thứ hai, xác định một lớp

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)5 kế thừa từ lớp

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)4:

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)

Thứ ba, tạo một thể hiện mới của lớp

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)5:

if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming''Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} )

Code language: Python (python)

Giả sử bạn muốn chuyển đổi đối tượng

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)5 thành từ điển. Để làm điều đó, bạn có thể thêm một phương thức mới vào lớp

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)5, chuyển đổi đối tượng thành từ điển.

Tuy nhiên, bạn có thể muốn chuyển đổi các đối tượng của các lớp khác thành từ điển. Để làm cho mã có thể tái sử dụng, bạn có thể xác định một lớp mixin có tên là

if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming''Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} )

Code language: Python (python)0 như sau:

class DictMixin: def to_dict(self): return self._traverse_dict(self.__dict__) def _traverse_dict(self, attributes: dict) -> dict: result = {} for key, value in attributes.items(): result[key] = self._traverse(key, value) return result def _traverse(self, key, value): if isinstance(value, DictMixin): return value.to_dict() elif isinstance(value, dict): return self._traverse_dict(value) elif isinstance(value, list): return [self._traverse(key, v) for v in value] elif hasattr(value, '__dict__'): return self._traverse_dict(value.__dict__) else: return value

Code language: Python (python)

Lớp

if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming''Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} )

Code language: Python (python)0 có phương pháp

if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming''Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} )

Code language: Python (python)2 chuyển đổi một đối tượng thành từ điển.

Phương thức

if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming''Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} )

Code language: Python (python)3 lặp lại các thuộc tính của đối tượng và gán khóa và giá trị cho kết quả.

Thuộc tính của một đối tượng có thể là một danh sách, từ điển hoặc một đối tượng có thuộc tính

if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming''Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} )

Code language: Python (python)4. Do đó, phương thức

if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming''Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} )

Code language: Python (python)3 sử dụng phương thức

if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming''Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} )

Code language: Python (python)6 để chuyển đổi thuộc tính thành giá trị.

Để chuyển đổi các trường hợp của lớp

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)5 thành từ điển,

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)5 cần phải thừa hưởng từ cả hai lớp

if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming''Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} )

Code language: Python (python)0 và

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)4:

class Employee(DictMixin, Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)

Lưu ý rằng bạn cần chỉ định các lớp mixin trước các lớp khác.

Sau đây tạo ra một thể hiện mới của lớp

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)5 và chuyển đổi nó thành từ điển:

e = Employee( name='John', skills=['Python Programming', 'Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} ) pprint(e.to_dict())

Code language: Python (python)

Output:

{'dependents': {'children': ['Alice', 'Bob'], 'wife': 'Jane'}, 'name': 'John', 'skills': ['Python Programming', 'Project Management']}

Code language: Python (python)

Những điều sau đây cho thấy mã hoàn chỉnh:

from pprint import pprint class DictMixin: def to_dict(self): return self._traverse_dict(self.__dict__) def _traverse_dict(self, attributes): result = {} for key, value in attributes.items(): result[key] = self._traverse(key, value) return result def _traverse(self, key, value): if isinstance(value, DictMixin): return value.to_dict() elif isinstance(value, dict): return self._traverse_dict(value) elif isinstance(value, list): return [self._traverse(key, v) for v in value] elif hasattr(value, '__dict__'): return self._traverse_dict(value.__dict__) else: return value class Person: def __init__(self, name): self.name = name class Employee(DictMixin, Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming', 'Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} ) pprint(e.to_dict())

Code language: Python (python)

Compose nhiều lớp mixin

Giả sử bạn muốn chuyển đổi đối tượng của ____ 15 thành JSON. Để làm điều đó, trước tiên bạn có thể xác định một lớp mixin mới sử dụng mô -đun tiêu chuẩn

class DictMixin: def to_dict(self): return self._traverse_dict(self.__dict__) def _traverse_dict(self, attributes: dict) -> dict: result = {} for key, value in attributes.items(): result[key] = self._traverse(key, value) return result def _traverse(self, key, value): if isinstance(value, DictMixin): return value.to_dict() elif isinstance(value, dict): return self._traverse_dict(value) elif isinstance(value, list): return [self._traverse(key, v) for v in value] elif hasattr(value, '__dict__'): return self._traverse_dict(value.__dict__) else: return value

Code language: Python (python)3:

import json class JSONMixin: def to_json(self): return json.dumps(self.to_dict())

Code language: Python (python)

Và sau đó thay đổi lớp

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)5 để nó kế thừa lớp

class DictMixin: def to_dict(self): return self._traverse_dict(self.__dict__) def _traverse_dict(self, attributes: dict) -> dict: result = {} for key, value in attributes.items(): result[key] = self._traverse(key, value) return result def _traverse(self, key, value): if isinstance(value, DictMixin): return value.to_dict() elif isinstance(value, dict): return self._traverse_dict(value) elif isinstance(value, list): return [self._traverse(key, v) for v in value] elif hasattr(value, '__dict__'): return self._traverse_dict(value.__dict__) else: return value

Code language: Python (python)5:

class Employee(DictMixin, JSONMixin, Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)

Sau đây tạo ra một thể hiện mới của lớp

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)5 và chuyển đổi nó thành từ điển và JSON:

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)0

Output:

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)1

Những điều sau đây cho thấy mã hoàn chỉnh:

class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents

Code language: Python (python)2

from pprint import pprint class DictMixin: def to_dict(self): return self._traverse_dict(self.__dict__) def _traverse_dict(self, attributes): result = {} for key, value in attributes.items(): result[key] = self._traverse(key, value) return result def _traverse(self, key, value): if isinstance(value, DictMixin): return value.to_dict() elif isinstance(value, dict): return self._traverse_dict(value) elif isinstance(value, list): return [self._traverse(key, v) for v in value] elif hasattr(value, '__dict__'): return self._traverse_dict(value.__dict__) else: return value class Person: def __init__(self, name): self.name = name class Employee(DictMixin, Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents if __name__ == '__main__': e = Employee( name='John', skills=['Python Programming', 'Project Management'], dependents={'wife': 'Jane', 'children': ['Alice', 'Bob']} ) pprint(e.to_dict())

Code language: Python (python)

  • Compose nhiều lớp mixin

Giả sử bạn muốn chuyển đổi đối tượng của ____ 15 thành JSON. Để làm điều đó, trước tiên bạn có thể xác định một lớp mixin mới sử dụng mô -đun tiêu chuẩn

class DictMixin: def to_dict(self): return self._traverse_dict(self.__dict__) def _traverse_dict(self, attributes: dict) -> dict: result = {} for key, value in attributes.items(): result[key] = self._traverse(key, value) return result def _traverse(self, key, value): if isinstance(value, DictMixin): return value.to_dict() elif isinstance(value, dict): return self._traverse_dict(value) elif isinstance(value, list): return [self._traverse(key, v) for v in value] elif hasattr(value, '__dict__'): return self._traverse_dict(value.__dict__) else: return value

Code language: Python (python)3:

Chủ đề