Hàm super[] trả về một đối tượng proxy, một đối tượng thay thế có thể gọi phương thức của lớp cơ sở thông qua ủy quyền. Nó được gọi là sự gián tiếp, là khả năng tham chiếu các đối tượng cơ sở với super[]. Siêu chức năng rất linh hoạt và có thể được sử dụng theo nhiều cách khác nhau
Nếu trước đây bạn đã từng làm việc với các ngôn ngữ OOP như PHP hoặc Javascript, thì super[] bạn sẽ bắt gặp từ khóa super
siêu trăn
Super[] là một hàm Python tích hợp trả về đối tượng proxy, cho phép bạn tham chiếu đến lớp cha bằng 'super. ’ Hàm super[] cung cấp cho bạn quyền truy cập vào các phương thức trong một lớp cha từ lớp con kế thừa từ nó. Nó có thể được sử dụng để lấy các phương thức kế thừa, từ lớp cha hoặc lớp anh chị em.
Riêng super[] trả về một đối tượng tạm thời của siêu lớp cho phép bạn gọi các phương thức của siêu lớp đó
Nếu super[] sẵn có của Python không làm bạn ngạc nhiên, rất có thể bạn không biết super[] có khả năng làm gì hoặc cách sử dụng nó một cách hiệu quả
Nếu chúng ta muốn hiểu về siêu hàm Python, chúng ta cần biết về Tính kế thừa trong Python. Trong Kế thừa Python, các lớp con có thể kế thừa từ lớp cha
Siêu hàm Python có thể tham chiếu ngầm đến siêu lớp. Vì vậy, hàm super[] trong Python giúp nhiệm vụ của chúng ta dễ quản lý hơn
Trong khi đề cập đến lớp cha từ lớp cơ sở, chúng ta không cần phải viết tên của lớp cha một cách rõ ràng.
Phương thức super[] trong Python cho phép bạn gọi các phương thức của lớp cha trong lớp con của bạn. Trường hợp sử dụng chính của điều này là để mở rộng chức năng của phương thức kế thừa
Phương thức super[] cũng có thể nhận hai tham số
- phân lớp
- Một đối tượng là một thể hiện của lớp con đó
Chúng ta sẽ thảo luận chi tiết về python super[] trong các phần sau
Tại sao nên sử dụng hàm super[] trong Python
Chúng tôi sử dụng hàm super[] vì nó giúp bạn không phải viết lại các phương thức đó trong lớp con của mình và cho phép bạn hoán đổi các lớp cha với những thay đổi mã tối thiểu. Hàm super[] trả về một đối tượng tạm thời của siêu lớp cho phép bạn gọi các phương thức của siêu lớp đó.
Cách gọi hàm super[] trong Python 3
Để gọi một hàm super[] trong Python, hãy tạo một lớp cha và lớp con và kế thừa lớp cha cho lớp con rồi gọi phương thức super[] từ lớp con. Trước tiên, chúng tôi sẽ lấy một định nghĩa lớp thông thường và sửa đổi nó bằng cách thêm siêu hàm.
class MyParentClass[]: def __init__[self]: pass class SubClass[MyParentClass]: def __init__[self]: super[]
Như bạn có thể thấy, đây là thiết lập cơ bản của thừa kế đơn
Chúng ta có thể thấy rằng có lớp cơ sở hoặc lớp cha [đôi khi còn được gọi là lớp cha ] và lớp dẫn xuất hoặc lớp con, nhưng we still need to initialize the parent or base class within the subclass or derived or child.
Chúng ta có thể gọi hàm super[] để xử lý dễ tiếp cận hơn.
Mục tiêu của hàm Super là cung cấp một giải pháp di động và trừu tượng hơn nhiều để khởi tạo các lớp
Hãy xem ví dụ về hàm super[] trong Python
# app.py class Computer[]: def __init__[self, computer, ram, ssd]: self.computer = computer self.ram = ram self.ssd = ssd class Laptop[Computer]: def __init__[self, computer, ram, ssd, model]: super[].__init__[computer, ram, ssd] self.model = model lenovo = Laptop['lenovo', 2, 512, 'l420'] print['This computer is:', lenovo.computer] print['This computer has ram of', lenovo.ram] print['This computer has ssd of', lenovo.ssd] print['This computer has this model:', lenovo.model]
Trong ví dụ trên, chúng ta đã định nghĩa một lớp cơ sở là Máy tính và lớp dẫn xuất là Máy tính xách tay.
Chúng ta đã định nghĩa ba thuộc tính bên trong lớp cơ sở và lớp dẫn xuất có bốn thuộc tính
Ba thuộc tính từ lớp dẫn xuất được dẫn xuất từ lớp cơ sở và thuộc tính thứ tư là thuộc tính riêng của lớp đó. Ngoài ra, lớp dẫn xuất hoặc lớp con có thuộc tính model. Ba cái còn lại được lấy từ một máy tính hạng cơ sở
Vì vậy, nếu chúng ta chỉ tạo một đối tượng của lớp dẫn xuất, chúng ta vẫn có tất cả quyền truy cập vào thuộc tính của lớp cơ sở do .
Đầu ra của ví dụ trên là như sau
Hàm super[] trong Python với Kế thừa đơn
Kế thừa là khái niệm trong lập trình hướng đối tượng, trong đó một lớp kế thừa [hoặc kế thừa] các thuộc tính và hành vi từ một lớp khác mà không cần triển khai lại chúng
Xem chương trình sau
# app.py class Rectangle: def __init__[self, length, width]: self.length = length self.width = width def area[self]: return self.length * self.width def perimeter[self]: return 2 * self.length + 2 * self.width class Square: def __init__[self, length]: self.length = length def area[self]: return self.length * self.length def perimeter[self]: return 4 * self.length sqr = Square[4] print["Area of Square is:", sqr.area[]] rect = Rectangle[2, 4] print["Area of Rectangle is:", rect.area[]]
Xem đầu ra
➜ pyt python3 app.py Area of Square is: 16 Area of Rectangle is: 8 ➜ pyt
Trong ví dụ trên, bạn có hai hình liên quan với nhau. Hình vuông là loại hình chữ nhật đặc biệt
Tuy nhiên, mã không phản ánh mối quan hệ giữa hai hình dạng đó và do đó có mã nhất thiết phải lặp lại. Vì vậy, chúng ta cần áp dụng các nguyên tắc mã cơ bản như Đừng lặp lại chính mình
Sử dụng cách kế thừa phù hợp có thể giảm số lượng mã bạn viết đồng thời phản ánh mối quan hệ trong thế giới thực giữa các hình dạng đó như hình chữ nhật và hình vuông
# app.py class Rectangle: def __init__[self, length, width]: self.length = length self.width = width def area[self]: return self.length * self.width def perimeter[self]: return 2 * self.length + 2 * self.width class Square[Rectangle]: def __init__[self, length]: super[].__init__[length, length] sqr = Square[4] print["Area of Square is:", sqr.area[]] rect = Rectangle[2, 4] print["Area of Rectangle is:", rect.area[]]
Trong ví dụ này, một Rectangle là một siêu lớp. Square là một phân lớp vì các phương thức __init__[] của Square và Rectangle có liên quan với nhau đến mức chúng ta có thể gọi phương thức __init__[] của siêu lớp [Rectangle. __init__[]] từ Square bằng cách sử dụng từ khóa super[].
Điều này đặt các thuộc tính chiều dài và chiều rộng mặc dù bạn phải cung cấp tham số chiều dài duy nhất cho hàm tạo Square
Khi bạn chạy cái này, mặc dù lớp Square của bạn không triển khai nó một cách rõ ràng, lệnh gọi đến. area[] sẽ sử dụng một phương thức area[] trong superclass và in 16
Lớp Square kế thừa. area[] từ lớp Hình chữ nhật
Xem đầu ra
➜ pyt python3 app.py Area of Square is: 16 Area of Rectangle is: 8 ➜ pyt
Nó giống như trên
Hàm super[] trong Python với thừa kế đa cấp
Trước đây chúng ta đã nói rằng hàm super[] của Python cho phép chúng ta ngầm định tham chiếu đến lớp cha. Nhưng trong kịch bản kế thừa đa cấp, nó sẽ đề cập đến lớp nào? .
Hàm super[] có thể tham chiếu đến hàm __init[]__ và gọi tất cả các hàm khác của một lớp cha
Xem ví dụ sau
# app.py class A: def __init__[self]: print['Initializing: class A'] def sub_method[self, b]: print['Printing from class A:', b] class B[A]: def __init__[self]: print['Initializing: class B'] super[].__init__[] def sub_method[self, b]: print['Printing from class B:', b] super[].sub_method[b + 1] class C[B]: def __init__[self]: print['Initializing: class C'] super[].__init__[] def sub_method[self, b]: print['Printing from class C:', b] super[].sub_method[b + 1] if __name__ == '__main__': c = C[] c.sub_method[1]
Xem đầu ra bên dưới
Vì vậy, từ đầu ra, chúng ta có thể thấy rằng hàm __init[]__ của lớp C đã được gọi lúc đầu, sau đó là lớp B và sau đó là lớp A.
Điều tương tự cũng xảy ra khi gọi hàm sub_method[]
Nếu chương trình của bạn chứa thừa kế đa cấp thì hàm super[] cũng có lợi cho bạn
Hàm super[] trong Python với đa kế thừa
Trong đa kế thừa, hàm super[] rất tiện dụng. Python hỗ trợ đa kế thừa, trong đó lớp dẫn xuất có thể kế thừa từ nhiều lớp cơ sở mà không nhất thiết phải kế thừa lẫn nhau
Trong đa kế thừa, các tính năng của tất cả các lớp cha được kế thừa vào lớp con. Như vậy, cú pháp của đa thừa kế tương tự như đơn thừa kế
class Base1: pass class Base2: pass class MultiDerived[Base1, Base2]: pass
Ở đây, MultiDerived được lấy từ các lớp Base1 và Base2. Xem đoạn mã sau
________số 8đầu ra
Name: Michael, Pay: 250000, Exp: 5
Trong ví dụ này, lớp TeamMember có hai thuộc tính. tên và uid. Lớp công nhân có hai thuộc tính. lương và chức vụ. Cả hai lớp này đều là lớp cơ sở
Sau đó, chúng tôi đã định nghĩa một lớp dẫn xuất được gọi là TeamLeader, mở rộng TeamMember và Worker
Điều đó có nghĩa là chúng ta có thể truy cập tất cả các thuộc tính của lớp Cha trong lớp con hoặc lớp dẫn xuất
Ở dòng cuối cùng, chúng ta đã tạo một đối tượng và chuyển bốn thuộc tính vào hàm tạo. Và cuối cùng, chúng ta sẽ nhận được đầu ra
Ghi đè các phương thức bằng cách sử dụng super[]
Khi bạn định nghĩa một phương thức của lớp cha trong lớp con, quá trình này được gọi là Ghi đè
Nói cách khác, lớp con có thể ghi đè các phương thức cha hoặc lớp cha của nó bằng cách định nghĩa hàm có cùng tên
Tuy nhiên, có một số quy tắc để ghi đè
- Tên của phương thức phải giống với tham số của nó
- Nếu phương thức của lớp cha là riêng tư [được bắt đầu bằng hai dấu gạch dưới], bạn không thể ghi đè lên nó
Trong Python, bạn có thể sử dụng phương thức super[] để ghi đè. Nó có cú pháp sau
# app.py class Computer[]: def __init__[self, computer, ram, ssd]: self.computer = computer self.ram = ram self.ssd = ssd class Laptop[Computer]: def __init__[self, computer, ram, ssd, model]: super[].__init__[computer, ram, ssd] self.model = model lenovo = Laptop['lenovo', 2, 512, 'l420'] print['This computer is:', lenovo.computer] print['This computer has ram of', lenovo.ram] print['This computer has ssd of', lenovo.ssd] print['This computer has this model:', lenovo.model]0
Xem đoạn mã sau
# app.py class Computer[]: def __init__[self, computer, ram, ssd]: self.computer = computer self.ram = ram self.ssd = ssd class Laptop[Computer]: def __init__[self, computer, ram, ssd, model]: super[].__init__[computer, ram, ssd] self.model = model lenovo = Laptop['lenovo', 2, 512, 'l420'] print['This computer is:', lenovo.computer] print['This computer has ram of', lenovo.ram] print['This computer has ssd of', lenovo.ssd] print['This computer has this model:', lenovo.model]1
đầu ra
# app.py class Computer[]: def __init__[self, computer, ram, ssd]: self.computer = computer self.ram = ram self.ssd = ssd class Laptop[Computer]: def __init__[self, computer, ram, ssd, model]: super[].__init__[computer, ram, ssd] self.model = model lenovo = Laptop['lenovo', 2, 512, 'l420'] print['This computer is:', lenovo.computer] print['This computer has ram of', lenovo.ram] print['This computer has ssd of', lenovo.ssd] print['This computer has this model:', lenovo.model]2
Python siêu khởi tạo
Hàm super[] trong Python cho phép bạn tránh đề cập rõ ràng đến lớp cơ sở, điều này có thể rất tuyệt vời. Nhưng lợi thế chính đi kèm với tính đa kế thừa, nơi có thể xảy ra tất cả các loại nội dung thú vị
Cú pháp đã thay đổi trong Python 3. 0. bạn có thể nói siêu[]. __init__[] thay vì super[ChildB, self]. __init__[], theo ý kiến của tôi, đẹp hơn một chút
Chúng tôi sử dụng super trong Python, để các lớp con sử dụng đa kế thừa sẽ gọi đúng hàm của lớp cha tiếp theo trong Thứ tự phân giải phương thức [MRO]
Sự khác biệt chính là bạn nhận được lớp điều hướng trong __init__ với super, lớp này sử dụng lớp hiện tại để xác định __init__ của lớp tiếp theo để tra cứu trong MRO
Nếu chúng tôi không có siêu đối tượng, chúng tôi sẽ phải viết mã thủ công ở mọi nơi [hoặc tạo lại nó. ] để đảm bảo rằng chúng ta gọi đúng phương thức tiếp theo trong Thứ tự giải quyết phương thức
Làm thế nào để siêu thực hiện điều này trong Python 3 mà không nói rõ lớp và thể hiện nào từ phương thức mà nó được gọi từ đó?
Nó nhận được khung ngăn xếp cuộc gọi
Nó tìm thấy lớp [được lưu trữ hoàn toàn dưới dạng một biến tự do cục bộ, __class__, làm cho hàm gọi là một đóng đối với lớp] và đối số đầu tiên cho hàm đó, sẽ là thể hiện hoặc lớp thông báo cho nó Thứ tự giải quyết phương thức [MRO] nào
Thứ tự giải quyết phương pháp [MRO]
Thứ tự phân giải phương thức [MRO] là cách các phương thức nên được kế thừa khi có nhiều kế thừa. Bạn có thể xem MRO bằng thuộc tính __mro__
Thứ tự phân giải phương thức [hoặc MRO] yêu cầu Python tìm kiếm các phương thức kế thừa. Điều này rất hữu ích khi bạn đang sử dụng super[] vì MRO có nghĩa là bạn biết chính xác nơi Python sẽ tìm phương thức bạn đang gọi với super[] và theo thứ tự nào
Mỗi lớp có một. Thuộc tính __mro__ để kiểm tra đơn hàng
Phần kết luận
Trong hướng dẫn này, bạn đã học cách sử dụng super[] với các lớp của mình
Hành trình của bạn bắt đầu với việc xem xét kế thừa đơn lẻ và sau đó chỉ ra cách gọi nhanh các phương thức của lớp cha với super[]
Sau đó, bạn đã tìm hiểu cách thức hoạt động của đa kế thừa trong Python và các kỹ thuật để kết hợp super[] với đa kế thừa
Kiểm tra các tài nguyên khác để biết thêm thông tin về lập trình hướng đối tượng trong Python và super[]
Cuối cùng, Ví dụ về siêu hàm Python đã kết thúc
Bài viết đề xuất
Trang trí Python
Cách phân tích cú pháp JSON bằng Python
Xử lý tệp trong Python
Từ điển Python
Xử lý ngoại lệ trong Python
Bài viết trước API ngữ cảnh phản ứng. Mọi thứ bạn cần biết
Bài viết tiếp theo Thanh bên phản ứng. Hướng dẫn đầy đủ
kranal
https. //appdividend. com/
Krunal Lathiya là Kỹ sư phần mềm với hơn tám năm kinh nghiệm. Anh ấy đã phát triển một nền tảng vững chắc về các nguyên tắc khoa học máy tính và niềm đam mê giải quyết vấn đề. Ngoài ra, Krunal có kiến thức tuyệt vời về Khoa học dữ liệu và Học máy, đồng thời là chuyên gia về Ngôn ngữ Python. Krunal có kinh nghiệm với nhiều ngôn ngữ lập trình và công nghệ khác nhau, bao gồm PHP, R, Golang và JavaScript. Anh ấy cảm thấy thoải mái khi làm việc trong lĩnh vực phát triển front-end và back-end