Lập trình hướng đối tượng trong python datacamp github
"self" được trình thông dịch gán cho đối tượng hiện tại khi một phương thức được gọi và trình thông dịch mong đợi đối số đầu tiên của mỗi phương thức sẽ tính đến điều này Show Ghi đè là thay đổi hoặc thay thế một phương thức của lớp cha bằng một phương thức mới (có cùng tên) trong lớp con. Không cần cú pháp đặc biệt để làm điều này; Hàm super() trả về đối tượng như một thể hiện của lớp cha, cho phép chúng ta gọi trực tiếp phương thức cha đa thừa kế. Một lớp con kế thừa từ nhiều hơn một lớp cha có thể truy cập chức năng từ cả hai lớp đó. Hình thức đa thừa kế đơn giản và hữu ích nhất được gọi là mixin. Một mixin nói chung là một siêu lớp không tồn tại riêng mà được kế thừa bởi một số lớp khác để cung cấp chức năng bổ sung # Example class Contact: #all_contacts = [] all_contacts = ContactList() def __init__(self, name, email): self.name = name self.email = email #Contact.all_contacts.append(self) self.all_contacts.append(self) class MailSender: def send_mail(self, message): print("sending mail to " + self.email) # multiple inheritance class EmailableContact(Contact, MailSender): pass Cú pháp đa thừa kế trông giống như một danh sách tham số trong định nghĩa lớp. Thay vì bao gồm một lớp cơ sở bên trong dấu ngoặc đơn, chúng tôi bao gồm hai (hoặc nhiều hơn) được phân tách bằng dấu phẩy
Vấn đề kim cương
class Addressholder: def __init__(self, street, city, state, code): self.street = street self.city = city self.state = state self.code = code class Friend(Contact, Addressholder): def __init__(self, name, email, phone, street, city, state, code): Contact.__init__(self, name, email) AddressHolder.__init__(self, street, city, state, code) self.phone = phone Trong ví dụ này, chúng ta gọi trực tiếp hàm init trên mỗi lớp cha và chuyển đối số self một cách rõ ràng. Ví dụ này hoạt động về mặt kỹ thuật; chúng ta có thể truy cập các biến khác nhau trực tiếp trên lớp. Nhưng có một vài vấn đề
Phương thức init từ lớp Friend trước tiên gọi init trên Contact để khởi tạo hoàn toàn siêu lớp đối tượng (tất cả các lớp bắt nguồn từ obejct). Sau đó, Friend gọi lệnh init trên AddressHolder, lệnh này ngầm khởi tạo lại siêu lớp đối tượng. Lớp cha đã được thiết lập hai lần. Hãy tưởng tượng cố gắng kết nối với cơ sở dữ liệu hai lần cho mọi yêu cầu. Lớp cơ sở chỉ nên được gọi một lần
Hãy xem xét một ví dụ thứ hai minh họa vấn đề này rõ ràng hơn. Ở đây có một lớp cơ sở có một phương thức tên là call_me. Hai lớp con ghi đè phương thức đó và sau đó một lớp con khác mở rộng cả hai lớp này bằng cách sử dụng đa kế thừa. Điều này được gọi là kế thừa kim cương vì hình dạng kim cương của sơ đồ lớp Kim cương là thứ khiến cho việc thừa kế trở nên khó khăn. Về mặt kỹ thuật, tất cả đa kế thừa trong Python3 là kế thừa kim cương, bởi vì tất cả các lớp đều kế thừa từ đối tượng class MyClass: @classmethod #<--use decorator to declare a class method def my_method(cls, args..): #<--cls argument refers to the class # execute # can't use any instance attributes0 class MyClass: @classmethod #<--use decorator to declare a class method def my_method(cls, args..): #<--cls argument refers to the class # execute # can't use any instance attributes1 Phương thức call_me của lớp cơ sở đã được gọi hai lần
class MyClass: @classmethod #<--use decorator to declare a class method def my_method(cls, args..): #<--cls argument refers to the class # execute # can't use any instance attributes2 class MyClass: @classmethod #<--use decorator to declare a class method def my_method(cls, args..): #<--cls argument refers to the class # execute # can't use any instance attributes3
Quá tải toán tử. so sánhbình đẳng đối tượngclass MyClass: @classmethod #<--use decorator to declare a class method def my_method(cls, args..): #<--cls argument refers to the class # execute # can't use any instance attributes4
So sánh tùy chỉnhclass MyClass: @classmethod #<--use decorator to declare a class method def my_method(cls, args..): #<--cls argument refers to the class # execute # can't use any instance attributes5
Quá tải eq() (bình đẳng)
class MyClass: @classmethod #<--use decorator to declare a class method def my_method(cls, args..): #<--cls argument refers to the class # execute # can't use any instance attributes6 Các toán tử so sánh khác
Kiểm tra bình đẳng lớp
Xét hai lớpclass MyClass: @classmethod #<--use decorator to declare a class method def my_method(cls, args..): #<--cls argument refers to the class # execute # can't use any instance attributes7
So sánh và kế thừa
class MyClass: @classmethod #<--use decorator to declare a class method def my_method(cls, args..): #<--cls argument refers to the class # execute # can't use any instance attributes8
Quá tải toán tử. biểu diễn chuỗiChuỗi đại diện của các đối tượng
In một đối tượng
Thực hiện. str
class MyClass: @classmethod #<--use decorator to declare a class method def my_method(cls, args..): #<--cls argument refers to the class # execute # can't use any instance attributes9 Thực hiện. đại diện
10
ngoại lệxử lý ngoại lệ
11Ngoại lệ là các lớp
Ngoại lệ tùy chỉnh
12Bắt ngoại lệ tùy chỉnh 13Xử lý phân cấp ngoại lệ
Thiết kế cho sự kế thừa và đa hìnhđa hình
Tất cả những gì quan trọng là một giao diện
14
Nguyên tắc thay thế Liskov
LSP vi phạm
Không LSP - Không kế thừa
|