Python gọi phương thức siêu lớp

Python không hoàn toàn là một ngôn ngữ hướng đối tượng và nó đủ khả năng mở rộng và đủ mạnh để cho phép bạn tạo các ứng dụng của mình bằng cách sử dụng mô hình hướng đối tượng. Một trong những cách Python đạt được điều này là bằng cách hỗ trợ tính kế thừa, điều mà nó thực hiện với super[]

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ố

  1. phân lớp
  2. 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 đè

  1. Tên của phương thức phải giống với tham số của nó
  2. 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

Facebook

Twitter

Pinterest

WhatsApp

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

Phương thức super[] trong Python là gì?

Hàm super[] được dùng để cấp quyền truy cập vào các phương thức và thuộc tính của lớp cha hoặc lớp anh chị em . Hàm super[] trả về một đối tượng đại diện cho lớp cha.

Siêu [] __ Init__ trong Python là gì?

Hiểu Python super[] với các phương thức __init__[] . Ghi chú. Để biết thêm thông tin, hãy tham khảo Kế thừa trong Python. The super function returns a temporary object of the superclass that allows access to all of its methods to its child class. Note: For more information, refer to Inheritance in Python.

__ gọi __ trong lớp Python là gì?

__call__ trong Python . Khi thể hiện được gọi là một hàm; . ] là viết tắt của x. enables Python programmers to write classes where the instances behave like functions and can be called like a function. When the instance is called as a function; if this method is defined, x[arg1, arg2, ...] is a shorthand for x.

Siêu [] có cần thiết Python không?

Nói chung là cần thiết . Và nó thường là lệnh gọi đầu tiên trong init của bạn. Đầu tiên nó gọi hàm init của lớp cha [ dict ]. Nó thường tạo cấu trúc dữ liệu cơ bản của nó.

Chủ Đề