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ớpclass 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ớpclass 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ápif __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ứcif __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ứcif __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ớpif __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ớpclass 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)0Output:
class Employee(Person): def __init__(self, name, skills, dependents): super().__init__(name) self.skills = skills self.dependents = dependents
Code language: Python (python)1Nhữ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)2from 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: