Trang web này được hỗ trợ rộng rãi bởi DataCamp. DataCamp cung cấp Hướng dẫn Python tương tác trực tuyến cho Khoa học dữ liệu. Tham gia cùng 575.000 người học khác và bắt đầu học Python cho khoa học dữ liệu ngay hôm nay
Chào mừng đến với LearnPython. hướng dẫn Python tương tác org
Cho dù bạn có phải là một lập trình viên có kinh nghiệm hay không, trang web này dành cho tất cả những ai muốn học ngôn ngữ lập trình Python
Bạn được hoan nghênh tham gia nhóm của chúng tôi trên Facebook để đặt câu hỏi, thảo luận và cập nhật
Sau khi bạn hoàn thành các hướng dẫn, bạn có thể được chứng nhận tại LearnX và thêm chứng nhận của bạn vào hồ sơ LinkedIn của bạn
Các ví dụ trên là các lớp và đối tượng ở dạng đơn giản nhất và không thực sự hữu ích trong các ứng dụng thực tế
Để hiểu ý nghĩa của các lớp, chúng ta phải hiểu hàm __init__[] tích hợp sẵn
Tất cả các lớp đều có một hàm gọi là __init__[], hàm này luôn được thực thi khi lớp bắt đầu
Sử dụng hàm __init__[] để gán giá trị cho thuộc tính đối tượng hoặc các thao tác khác cần thực hiện khi đối tượng được tạo
Thí dụ
Tạo một lớp tên là Person, sử dụng hàm __init__[] để gán giá trị cho tên và tuổi
lớp Người.
def __init__[bản thân, tên, tuổi].
bản thân. tên = tên
bản thân. tuổi = tuổi
p1 = Người["John", 36]
in[p1. tên]
in[p1. tuổi]
Ghi chú. Hàm
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science3 được gọi tự động mỗi khi lớp được sử dụng để tạo một đối tượng mới
Hàm __str__[]
Hàm __str__[] kiểm soát những gì sẽ được trả về khi đối tượng lớp được biểu diễn dưới dạng chuỗi
Nếu hàm __str__[] không được đặt, thì biểu diễn chuỗi của đối tượng được trả về
Thí dụ
Biểu diễn chuỗi của một đối tượng KHÔNG CÓ hàm __str__[]
lớp Người.
def __init__[bản thân, tên, tuổi].
bản thân. tên = tên
bản thân. tuổi = tuổi
p1 = Người["John", 36]
bản in[p1]
Tự mình thử »Thí dụ
Biểu diễn chuỗi của một đối tượng VỚI hàm __str__[]
lớp Người.
def __init__[bản thân, tên, tuổi].
bản thân. tên = tên
bản thân. tuổi = tuổi
def __str__[self].
return f"{self. tên}[{bản thân. tuổi}]"
p1 = Người["John", 36]
bản in[p1]
Tự mình thử »phương pháp đối tượng
Các đối tượng cũng có thể chứa các phương thức. Các phương thức trong các đối tượng là các chức năng thuộc về đối tượng
Hãy để chúng tôi tạo một phương thức trong lớp Person
Thí dụ
Chèn một hàm in lời chào và thực hiện nó trên đối tượng p1
lớp Người.
def __init__[bản thân, tên, tuổi].
bản thân. tên = tên
bản thân. tuổi = tuổi
def myfunc[self].
print["Xin chào tôi tên là " + tự. tên]
p1 = Person["John", 36]
p1. myfunc[]
Ghi chú. Tham số
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science4 là tham chiếu đến phiên bản hiện tại của lớp và được sử dụng để truy cập các biến thuộc về lớp
Tham số bản thân
Tham số
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science4 là tham chiếu đến phiên bản hiện tại của lớp và được sử dụng để truy cập các biến thuộc về lớp
Nó không nhất thiết phải được đặt tên là
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science4 , bạn có thể gọi nó là gì tùy thích, nhưng nó phải là tham số đầu tiên của bất kỳ chức năng nào trong lớp
Thí dụ
Sử dụng các từ mysillyobject và abc thay vì self
lớp Người.
def __init__[mysillyobject, name, age].
mysillyobject. name = name
mysillyobject. tuổi = tuổi
def myfunc[abc].
print["Xin chào, tên tôi là " + abc. tên]
p1 = Person["John", 36]
p1. myfunc[]
Sửa đổi thuộc tính đối tượng
Bạn có thể sửa đổi các thuộc tính trên các đối tượng như thế này
Xóa thuộc tính đối tượng
Bạn có thể xóa các thuộc tính trên các đối tượng bằng cách sử dụng từ khóa
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science7
Xóa đối tượng
Bạn có thể xóa các đối tượng bằng cách sử dụng từ khóa
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science7
Tuyên bố vượt qua
Định nghĩa
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science9 không thể để trống, nhưng nếu vì lý do nào đó bạn có định nghĩa
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science9 không có nội dung, hãy đặt câu lệnh
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science1 để tránh bị lỗi
Kế thừa là một trong những nguyên lý cơ bản của hướng đối tượng lập trình. Kế thừa là cơ chế tái sử dụng mã mà tất cả các ngôn ngữ lập trình hướng đối tượng đều thực thi
Python cũng hỗ trợ kế thừa. Cơ chế thực hiện kế thừa trong Python có điểm khác so với một số ngôn ngữ khác
ĐỘI DUNG CỦA BẢN DỊCH Ẩn
1. Ví dụ về kế thừa trong Python
2. Kế thừa trong Python
3. Ghi đè trong Python
4. Xáo trộn tên và kế thừa
5. Kế thừa và đa hình trong Python
6. Kết luận
Ví dụ về kế thừa trong Python
Kế thừa [kế thừa] là một công cụ rất mạnh trong việc lập trình hướng đối tượng cho phép tạo ra các lớp mới từ một lớp có sẵn. Qua đó có thể tái sử dụng mã của lớp đã có. Kế hoạch thừa giúp giảm thiểu việc lặp lại mã giữa các lớp
Hãy cùng thực hiện ví dụ sau đây
class Person: count = 0 def __init__[self, fname='', lname='', age=18]: self.fname = fname self.lname = lname self.age = age Person.count += 1 def print[self]: print[f'{self.fname} {self.lname} [{self.age} years old]'] @property def full_name[self]: return f'{self.fname} {self.lname}' @classmethod def print_count[cls]: print[f'{cls.count} objects created'] @staticmethod def birth_year[age: int] -> int: from datetime import datetime as dt year = dt.now[].year return year - age class Student[Person]: def __init__[self, fname='', lname='', age=18, group='', specialization='']: super[].__init__[fname, lname, age] self.group = group self.specialization = specialization def print[self]: super[].print[] print[f'Group {self.group}/{self.specialization}'] @property def academic_info[self]: return f'Group {self.group}, Specialization of {self.specialization}' if __name__ == '__main__': trump = Student['Donald', 'Trump', 22, '051311', 'Computer science'] trump.print[] print[trump.full_name] print[Student.count] Student.print_count[] print[Student.birth_year[37]] print[trump.academic_info]
Kết quả chạy chương trình như sau
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science
Trong ví dụ trên chúng tôi đã xây dựng hai lớp. Người và Sinh viên
Trong class Person, chúng ta tạo các thuộc tính thể hiện [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science2,
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science3,
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science0] trong hàm tạo, một thuộc tính lớp [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science1], một phương thức lớp [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science2], một phương thức tĩnh [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science3] và một thuộc tính [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science4]
Chúng ta xây dựng lớp thứ hai Student kế thừa từ Person. Lưu ý rằng trong Lớp Student chúng ta chỉ định nghĩa hàm tạo và phương thức print[]
Trump variable được tạo ra từ lớp Student. Tuy nhiên, khi sử dụng biến trump, chúng ta sẽ truy xuất lại truy xuất tới các thành viên của Layer Peson
Chúng ta gọi quan hệ giữa Student và Person là quan hệ kế thừa. Trong đó, Sinh viên kế thừa Người, hoặc Người sinh ra Sinh viên. Lớp Người gọi là lớp cha hoặc lớp cơ sở. Lớp sinh viên gọi là lớp con hoặc lớp dẫn xuất
Kế thừa trong Python
Cú pháp kế thừa kế thừa trong Python as after.
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science5. Như trong ví dụ ở phần trên, để khai báo Lớp Sinh viên kế thừa Lớp Người, chúng ta viết phần tiêu đề như sau.
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science6
Trong Python, lớp con kế thừa tất cả mọi thứ từ lớp cha. “Kế thừa” ở đây cần hiểu là tất cả những gì được định nghĩa ở lớp cha sẽ đều có thể sử dụng thông qua tên lớp con hoặc thông qua đối tượng của lớp con
Trong ví dụ trên, ở lớp cha chúng ta xây dựng đầy đủ những thành phần thường gặp ở lớp Python. hàm tạo [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science7], thuộc tính thể hiện [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science2,
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science3,
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science0], thuộc tính lớp [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science1], thuộc tính [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science4], phương thức lớp [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science2], phương thức tĩnh [
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science3]
Bạn có thể sử dụng tất cả các thành phần trên của Người qua đối tượng của Sinh viên hoặc qua lớp chính Sinh viên
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science5
Python cho phép một lớp con kế thừa nhiều lớp cha cùng lúc. Hiện tượng này được gọi là đa kế thừa [đa kế thừa]
Kế thừa cũng được hỗ trợ trong một số ngôn ngữ như C++. Tuy nhiên, nhìn chung người ta không khuyến khích sử dụng đa kế thừa vì nó có thể dẫn đến những kết quả khó dự đoán. Vì vậy, các ngôn ngữ như C# hay Java không hỗ trợ đa kế thừa
Mọi lớp trong Python đều kế thừa từ một lớp “tổ tông” chung – lớp
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science55. Tuy nhiên, khi xây dựng lớp mới, bạn không cần chỉ định đối tượng lớp cha. Python sẽ làm công việc này một cách tự động
Ghi đè trong Python
Lớp con khi kế thừa từ lớp cha sẽ có tất cả những gì định nghĩa trong lớp cha. Tuy nhiên, đôi khi những gì định nghĩa trong lớp lại không hoàn toàn phù hợp với lớp con
Ví dụ, trong lớp Người ở ví dụ trên có định nghĩa về phương thức
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science56. Lớp Sinh viên kế thừa Người cũng sẽ kế thừa
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science56. Tuy nhiên,
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science56 of Person only in ra các thông tin riêng của Person, bao gồm fname, lname và age. Trong khi đó Sinh viên tự định nghĩa thêm hai nhóm thuộc tính và chuyên ngành. Nghĩa là
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science56 mà Sinh viên kế thừa từ Người không hoàn toàn phù hợp
Từ những vấn đề tương tự dẫn đến nhu cầu viết lại một phương thức vốn đã được định nghĩa sẵn ở lớp cha. Hoặc cũng có thể đạt được theo cách khác. định nghĩa một phương thức mới trong lớp con có cùng tên và tham số với phương thức được kế thừa từ lớp cha [dĩ nhiên, các phần thân khác nhau]. Trong kế thừa, hiện tượng này được gọi là ghi đè phương thức [ghi đè phương thức]
Trong ví dụ của chúng ta, lớp con Học sinh ghi đè phương thức print[] của lớp cha Người. Trong lớp con Học sinh định nghĩa một phương thức print[] có cùng tiêu đề như phương thức print[] của Người nhưng với các phần khác biệt.
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science1
Khi gặp lệnh gọi print[] từ một đối tượng của Student, Python sẽ gọi phương thức print[] mới của Student
Python sử dụng cơ chế gọi là Method Resolution Order [MRO] để xác định xem cần phải thực hiện bất kỳ phương thức nào trong kế thừa
To idea in method print[] new has call
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science10. Đây là cách Python cho phép gọi hàm print[] cũ của Person. Ở đây chúng ta tận dụng hàm print[] của Layer Person để ra các thông tin vốn có sẵn ở Layer Person. Sau đó trong phần bổ sung những thông tin riêng của Student
Một vấn đề ghi đè thường gặp khác liên quan đến hàm tạo
Do hàm tạo __init__ được lớp con thừa kế, nếu bạn không có nhu cầu định nghĩa thêm thuộc tính riêng cho lớp con, thì bạn thậm chí không cần phải xây dựng hàm tạo ở lớp con nữa. Python tự động gọi hàm tạo của lớp cha khi tạo đối tượng của lớp con
Tuy nhiên, thông thường lớp con thông thường định nghĩa thêm thuộc tính của riêng mình. Do vậy, trong lớp con cũng thường định nghĩa hàm tạo của riêng mình. Các đối tượng này được gọi là ghi đè hàm tạo [ghi đè hàm tạo]
Khi ghi đè hàm tạo, bạn sẽ có yêu cầu gọi tới hàm tạo của lớp cha trước khi thêm thuộc tính riêng của lớp con. Chính xác hơn, khi ghi đè hàm tạo, bạn bắt buộc phải gọi hàm tạo của lớp cha trong hàm tạo của lớp con thông qua phương thức
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science11
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science4
Hàm super[] trả về một đối tượng proxy – một đối tượng tạm thời của lớp cha – giúp truy xuất phương thức của lớp cha từ lớp con. Hàm super[] giúp tránh sử dụng trực tiếp tên lớp cha và làm việc với đa kế thừa
Khi gặp hàm tạo ghi đè ở lớp con, Python sẽ không tự động gọi hàm tạo của lớp cha nữa mà sẽ chỉ gọi hàm tạo của lớp con. Nếu bạn không gọi hàm tạo của lớp cha trong hàm tạo mới của lớp con, Python sẽ không thể tạo các thuộc tính cần thiết cho lớp cha và sẽ dẫn đến lỗi
Mangling name và kế thừa
Trên thực tế không phải tất cả các biệt thự trong lớp cha đều là lớp con kế thừa. Nếu bạn sử dụng tên xáo trộn, các thành viên riêng tư [trong tên gọi có hai dấu gạch chân] sẽ không được kế thừa
Name mangling là cơ chế của Python để mô phỏng việc kiểm soát việc truy cập các thành viên của lớp. Python quy ước.
[1] nếu thành viên cần giới hạn truy cập trong phạm vi lớp thì tên gọi cần bắt đầu bằng hai dấu gạch chân. Ví dụ
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science12.
[2] nếu thành viên cần truy cập giới hạn trong phạm vi của lớp hoặc trong lớp con thì tên gọi cần bắt đầu bằng một dấu gạch chân. Ví dụ
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science13.
Python hoặc IDE sẽ sinh ra lỗi hoặc cảnh báo nếu khi sử dụng thuộc tính bạn vi phạm các quy ước trên
Để thử nghiệm, hãy bổ sung thêm hai thuộc tính sau vào hàm tạo của Person
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science7
Giờ hãy thử trải nghiệm các lệnh gọi sau
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science8
Trong command group 3 on, command thứ 3 sẽ gây ra lỗi.
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science14. Nghĩa là thuộc tính __private không được Student kế thừa
Trong khi đó truy xuất
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science15 không gây lỗi. Nghĩa là
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science13 được sinh viên kế thừa
Lưu ý, truy xuất _protected as on sẽ là IDE giống như PyCharm cảnh báo ‘Truy cập thành viên được bảo vệ của một lớp‘. Bạn không nên truy xuất thuộc tính được bảo vệ bên ngoài lớp cha hoặc bên ngoài lớp con
Như vậy tên mangling có khả năng kiểm tra truy cập trong kế thừa
Kế thừa và đa hình trong Python
Hãy cùng thực hiện ví dụ sau
Donald Trump [22 years old] Group 051311/Computer science Donald Trump 1 1 objects created 1983 Group 051311, Specialization of Computer science2
Trong ví dụ này chúng ta xây dựng 3 lớp Person, Student, Teacher. Trong đó Sinh viên kế thừa Người. Cả 3 class này đều có phương thức hiển thị[self]
Please for the method show_info[p]. Bạn không cần quan tâm p có kiểu gì, chỉ cần p chứa phương thức display[] là có thể sử dụng được trong show_info[]
call p. display[] như vậy liên quan đến cơ chế đa hình [đa hình]
In set the direction object, next inherit and multifigure is hai nguyên lý khác nhau
Đa hình thiết lập mối quan hệ là [tiếng Anh gọi là is-a] giữa kiểu cơ sở và kiểu dẫn xuất. Ví dụ, nếu chúng ta có lớp cơ sở Người và lớp dẫn xuất Sinh viên thì một đối tượng của Sinh viên cũng là đối tượng của Người, kiểu Sinh viên cũng là kiểu Người. Nói theo ngôn ngữ thông thường thì sinh viên cũng là người. Một anh sinh viên chắc chắn là một người
Trong khi đó, kế thừa liên quan đến tái sử dụng mã. Lớp con thừa hưởng mã của lớp cha
Nói cách khác, đa hình liên quan tới quan hệ về ngữ nghĩa, còn kế thừa liên quan tới cú pháp
Trong các ngôn ngữ như C++, C#, Java, hai khái niệm này hầu như được đồng nhất, có thể hiện tại chỗ
- lớp con thừa hưởng các thành viên của lớp cha [kế thừa, tái sử dụng mã];
- một đối tượng thuộc kiểu con có thể gán cho biến thuộc kiểu cha, tức là kiểu cơ sở có thể sử dụng để thay thế cho kiểu dẫn đầu ra [đa hình];
- một phương thức xử lý đối tượng kiểu cha thì sẽ xử lý đối tượng kiểu con
Tổ hợp kế thừa + đa hình cho phép các ngôn ngữ lập trình hướng đối tượng xử lý đối tượng ở dạng tổng quát
Trong Python this thing is true. Tuy nhiên, Python but soft dẻo hơn nữa. Python sử dụng nguyên lý có tên gọi là gõ ống dẫn để thực hiện cơ chế đa hình
Nguyên lý con vịt gõ [nguyên lý con vịt]. nếu một con vật nhìn giống con vịt, có thể đi và bơi như con vịt, thì nhất định nó là một con vịt. Như vậy, theo nguyên lý này, con thiên nga nhỏ cũng có thể xem là con vịt
Mặc dù nghe khá buồn cười nhưng nó có thể hiển thị đối tượng dạng nhận dạng đặc điểm của Python. đa hình trong Python đạt được không cần liên quan đến kế thừa. Đa hình trong Python liên quan đến các thành viên của lớp. Nếu hai đối tượng có các thành viên tương tự nhau thì chúng được xem là thuộc cùng một kiểu. Do vậy chúng ta có thể sử dụng trong cùng một hàm/phương thức
Như vậy, theo nguyên lý trên, nếu bạn xây dựng lớp Người, Học sinh, Giáo viên với cùng các thành viên, đối tượng của hai lớp này được xem là tương đồng và có thể truyền cho cùng một phương thức xử lý. Học sinh và giáo viên không cần có bất kỳ quan hệ gì về kế thừa