Hướng dẫn does python automatically call super? - python có tự động gọi super không?

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: siêu tải các lớp của bạn với Python Super () This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Supercharge Your Classes With Python super()

Show

Mặc dù Python không phải là ngôn ngữ hướng đối tượng, nhưng nó đủ linh hoạt và đủ mạnh để cho phép bạn xây dựng các ứng dụng của mình bằng mô hình hướng đối tượng. Một trong những cách mà Python đạt được điều này là bằng cách hỗ trợ thừa kế, mà nó làm với

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9.inheritance, which it does with
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9.

Trong hướng dẫn này, bạn sẽ tìm hiểu về những điều sau đây:

  • Khái niệm thừa kế trong Python
  • Nhiều kế thừa trong Python
  • Hàm
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    9 hoạt động như thế nào
  • Làm thế nào chức năng
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    9 trong một kế thừa duy nhất hoạt động
  • Làm thế nào chức năng
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    9 trong nhiều kế thừa hoạt động

Tổng quan về chức năng Python từ >>> square = Square(4) >>> square.area() 16 >>> rectangle = Rectangle(2,4) >>> rectangle.area() 8 9

Nếu bạn có kinh nghiệm với các ngôn ngữ hướng đối tượng, bạn có thể đã quen thuộc với chức năng của

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9.

Nếu không, đừng sợ! Mặc dù tài liệu chính thức khá kỹ thuật, nhưng ở cấp độ cao

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 cho phép bạn truy cập vào các phương thức trong một siêu lớp từ lớp con kế thừa từ nó.

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 Một mình trả về một đối tượng tạm thời của siêu lớp sau đó cho phép bạn gọi các phương thức siêu lớp đó.

Tại sao bạn muốn làm bất kỳ điều này? Mặc dù các khả năng bị giới hạn bởi trí tưởng tượng của bạn, một trường hợp sử dụng phổ biến là xây dựng các lớp mở rộng chức năng của các lớp được xây dựng trước đó.

Gọi các phương thức được xây dựng trước đó với

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 giúp bạn không cần viết lại các phương thức đó trong lớp con của bạn và cho phép bạn trao đổi các lớp học với các thay đổi mã tối thiểu.

>>> square = Square(4) >>> square.area() 16 >>> rectangle = Rectangle(2,4) >>> rectangle.area() 8 9 trong một kế thừa duy nhất

Nếu bạn không quen thuộc với các khái niệm lập trình hướng đối tượng, kế thừa có thể là một thuật ngữ lạ. Kế thừa là một khái niệm trong lập trình hướng đối tượng trong đó một lớp có được (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 thực hiện lại chúng.inheritance might be an unfamiliar term. Inheritance is a concept in object-oriented programming in which a class derives (or inherits) attributes and behaviors from another class without needing to implement them again.

Đối với tôi ít nhất, nó dễ hiểu hơn để hiểu các khái niệm này khi xem mã, vì vậy hãy để các lớp viết mô tả một số hình dạng:

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

Ở đây, có hai lớp tương tự:

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

# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)
9 và
>>> square = Square(4)
>>> square.area()
16
0.

Bạn có thể sử dụng chúng như dưới đây:

>>>

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

Trong ví dụ này, bạn có hai hình dạng có liên quan với nhau: một hình vuông là một loại hình chữ nhật đặc biệt. Tuy nhiên, mã không phản ánh mối quan hệ đó và do đó có mã về cơ bản được lặp lại.

Bằng cách sử dụng kế thừa, bạn 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 hình chữ nhật và hình vuông:

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

# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

Tại đây, bạn đã sử dụng

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 để gọi
>>> square = Square(4)
>>> square.area()
16
2 của lớp
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

# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)
9, cho phép bạn sử dụng nó trong lớp
>>> square = Square(4)
>>> square.area()
16
0 mà không cần lặp lại mã. Dưới đây, chức năng cốt lõi vẫn còn sau khi thực hiện các thay đổi:

>>>

>>> square = Square(4)
>>> square.area()
16

Trong ví dụ này, bạn có hai hình dạng có liên quan với nhau: một hình vuông là một loại hình chữ nhật đặc biệt. Tuy nhiên, mã không phản ánh mối quan hệ đó và do đó có mã về cơ bản được lặp lại.

Bằng cách sử dụng kế thừa, bạn 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 hình chữ nhật và hình vuông:

Tại đây, bạn đã sử dụng

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 để gọi
>>> square = Square(4)
>>> square.area()
16
2 của lớp
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

# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)
9, cho phép bạn sử dụng nó trong lớp
>>> square = Square(4)
>>> square.area()
16
0 mà không cần lặp lại mã. Dưới đây, chức năng cốt lõi vẫn còn sau khi thực hiện các thay đổi:inherited
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 from the
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

# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)
9 class.

Trong ví dụ này, 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 # Here we declare that the Square class inherits from the Rectangle class class Square(Rectangle): def __init__(self, length): super().__init__(length, length) 9 là siêu lớp và >>> square = Square(4) >>> square.area() 16 0 là lớp con.

Bởi vì các phương thức

>>> square = Square(4)
>>> square.area()
16
0 và
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

# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)
9
>>> square = Square(4)
>>> square.area()
16
9 rất giống nhau, bạn chỉ cần gọi phương thức siêu lớp ____ ____39 (
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
1) từ phương thức của
>>> square = Square(4)
>>> square.area()
16
0 bằng cách sử dụng
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9. Điều này đặt các thuộc tính
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
4 và
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
5 mặc dù bạn chỉ phải cung cấp một tham số
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
6 duy nhất cho hàm tạo
>>> square = Square(4)
>>> square.area()
16
0.

Khi bạn chạy điều này, mặc dù lớp

>>> square = Square(4)
>>> square.area()
16
0 của bạn không thực hiện rõ ràng nó, cuộc gọi đến
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 sẽ sử dụng phương thức
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 trong siêu lớp và in
>>> cube = Cube(3)
>>> cube.surface_area()
54
>>> cube.volume()
27
1. Lớp
>>> square = Square(4)
>>> square.area()
16
0 được kế thừa
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 từ lớp
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

# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)
9.

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 có thể làm gì cho bạn?

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length

Vậy

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 có thể làm gì cho bạn trong một kế thừa duy nhất?

>>>

>>> cube = Cube(3)
>>> cube.surface_area()
54
>>> cube.volume()
27

Trong ví dụ này, bạn có hai hình dạng có liên quan với nhau: một hình vuông là một loại hình chữ nhật đặc biệt. Tuy nhiên, mã không phản ánh mối quan hệ đó và do đó có mã về cơ bản được lặp lại.

Bằng cách sử dụng kế thừa, bạn 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 hình chữ nhật và hình vuông:

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 Trả về một đối tượng đại biểu cho lớp cha, vì vậy bạn gọi phương thức bạn muốn trực tiếp trên nó:
class Cube(Square):
    def surface_area(self):
        face_area = super(Square, self).area()
        return face_area * 6

    def volume(self):
        face_area = super(Square, self).area()
        return face_area * self.length
8.

Điều này không chỉ giúp chúng tôi không phải viết lại các tính toán khu vực mà còn cho phép chúng tôi thay đổi logic

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 bên trong ở một vị trí duy nhất. Điều này đặc biệt có ích khi bạn có một số lớp con kế thừa từ một siêu lớp.

Một lần lặn sâu >>> square = Square(4) >>> square.area() 16 >>> rectangle = Rectangle(2,4) >>> rectangle.area() 8 9

Trước khi đi vào nhiều kế thừa, hãy để Lừa đi đường vòng nhanh vào cơ chế của

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9.

Mặc dù các ví dụ ở trên (và bên dưới) gọi

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 mà không có bất kỳ tham số nào,
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 cũng có thể lấy hai tham số: thứ nhất là lớp con và tham số thứ hai là một đối tượng là một thể hiện của lớp con đó.

Đầu tiên, hãy để xem hai ví dụ cho thấy thao tác mà biến đầu tiên có thể làm, sử dụng các lớp đã được hiển thị:

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(Square, self).__init__(length, length)

Trong Python 3, cuộc gọi

class Triangle:
    def __init__(self, base, height):
        self.base = base
        self.height = height

    def area(self):
        return 0.5 * self.base * self.height

class RightPyramid(Triangle, Square):
    def __init__(self, base, slant_height):
        self.base = base
        self.slant_height = slant_height

    def area(self):
        base_area = super().area()
        perimeter = super().perimeter()
        return 0.5 * perimeter * self.slant_height + base_area
4 tương đương với cuộc gọi
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 không tham số. Tham số đầu tiên đề cập đến lớp con
>>> square = Square(4)
>>> square.area()
16
0, trong khi tham số thứ hai đề cập đến một đối tượng
>>> square = Square(4)
>>> square.area()
16
0, trong trường hợp này là
class Triangle:
    def __init__(self, base, height):
        self.base = base
        self.height = height

    def area(self):
        return 0.5 * self.base * self.height

class RightPyramid(Triangle, Square):
    def __init__(self, base, slant_height):
        self.base = base
        self.slant_height = slant_height

    def area(self):
        base_area = super().area()
        perimeter = super().perimeter()
        return 0.5 * perimeter * self.slant_height + base_area
8. Bạn cũng có thể gọi
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 với các lớp khác:

class Cube(Square):
    def surface_area(self):
        face_area = super(Square, self).area()
        return face_area * 6

    def volume(self):
        face_area = super(Square, self).area()
        return face_area * self.length

Trong ví dụ này, bạn đang đặt

>>> square = Square(4)
>>> square.area()
16
0 làm đối số lớp con thành
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9, thay vì
>>> cube = Cube(3)
>>> cube.surface_area()
54
>>> cube.volume()
27
7. Điều này khiến
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 bắt đầu tìm kiếm một phương thức phù hợp (trong trường hợp này là
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9) ở một cấp trên
>>> square = Square(4)
>>> square.area()
16
0 trong phân cấp trường hợp, trong trường hợp này là
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

# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)
9.

Trong ví dụ cụ thể này, hành vi không thay đổi. Nhưng hãy tưởng tượng rằng

>>> square = Square(4)
>>> square.area()
16
0 cũng đã thực hiện chức năng
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 mà bạn muốn đảm bảo
>>> cube = Cube(3)
>>> cube.surface_area()
54
>>> cube.volume()
27
7 không sử dụng. Gọi
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 theo cách này cho phép bạn làm điều đó.

Còn tham số thứ hai thì sao? Hãy nhớ rằng, đây là một đối tượng là một thể hiện của lớp được sử dụng làm tham số đầu tiên. Ví dụ,

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

01 phải trả về
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

02.

Bằng cách bao gồm một đối tượng khởi tạo,

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 trả về một phương thức ràng buộc: một phương thức bị ràng buộc với đối tượng, cung cấp cho phương thức bối cảnh đối tượng, chẳng hạn như bất kỳ thuộc tính thể hiện nào. Nếu tham số này không được bao gồm, phương thức được trả về chỉ là một hàm, không được liên kết với bối cảnh đối tượng.bound method: a method that is bound to the object, which gives the method the object’s context such as any instance attributes. If this parameter is not included, the method returned is just a function, unassociated with an object’s context.

Để biết thêm thông tin về các phương thức bị ràng buộc, các phương thức và chức năng không liên kết, hãy đọc tài liệu Python trên hệ thống mô tả của nó.

>>> square = Square(4) >>> square.area() 16 >>> rectangle = Rectangle(2,4) >>> rectangle.area() 8 9 trong nhiều kế thừa

Bây giờ, bạn đã làm việc thông qua một cái nhìn tổng quan và một số ví dụ về

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 và kế thừa đơn lẻ, bạn sẽ được giới thiệu để xem tổng quan và một số ví dụ sẽ chứng minh cách thức hoạt động của nhiều kế thừa và cách
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 cho phép chức năng đó.

Tổng quan về kế thừa

Có một trường hợp sử dụng khác trong đó

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 thực sự tỏa sáng, và trường hợp này không phổ biến như kịch bản thừa kế duy nhất. Ngoài sự thừa kế duy nhất, Python còn hỗ trợ nhiều kế thừa, trong đó một lớp con có thể kế thừa từ nhiều lớp siêu cấp mà don don nhất thiết phải kế thừa với nhau (còn được gọi là các lớp anh chị em).sibling classes).

Tôi là một người rất trực quan và tôi thấy các sơ đồ rất hữu ích để hiểu các khái niệm như thế này. Hình ảnh dưới đây cho thấy một kịch bản kế thừa rất đơn giản, trong đó một lớp kế thừa từ hai siêu lớp không liên quan (anh chị em):

Hướng dẫn does python automatically call super? - python có tự động gọi super không?
Một ví dụ được ghi lại của nhiều kế thừa (hình ảnh: Kyle Stratis)

Để minh họa tốt hơn nhiều kế thừa trong hành động, đây là một số mã để bạn thử, cho thấy cách bạn có thể xây dựng một kim tự tháp bên phải (một kim tự tháp có cơ sở vuông) ra khỏi

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

08 và
>>> square = Square(4)
>>> square.area()
16
0:

class Triangle:
    def __init__(self, base, height):
        self.base = base
        self.height = height

    def area(self):
        return 0.5 * self.base * self.height

class RightPyramid(Triangle, Square):
    def __init__(self, base, slant_height):
        self.base = base
        self.slant_height = slant_height

    def area(self):
        base_area = super().area()
        perimeter = super().perimeter()
        return 0.5 * perimeter * self.slant_height + base_area

Ví dụ này tuyên bố một lớp

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

08 và lớp
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

11 kế thừa từ cả
>>> square = Square(4)
>>> square.area()
16
0 và
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

08.

Bạn sẽ thấy một phương pháp

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 khác sử dụng
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 giống như trong một kế thừa duy nhất, với mục đích của nó đạt đến các phương thức
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

16 và
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 được xác định tất cả các cách trong lớp
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

# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)
9.

Tuy nhiên, vấn đề là cả hai lớp siêu (

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

08 và
>>> square = Square(4)
>>> square.area()
16
0) xác định A
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9. Dành một giây và suy nghĩ về những gì có thể xảy ra khi bạn gọi
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 vào
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

11, và sau đó thử gọi nó như bên dưới:

>>>

>> pyramid = RightPyramid(2, 4)
>> pyramid.area()
Traceback (most recent call last):
  File "shapes.py", line 63, in 
    print(pyramid.area())
  File "shapes.py", line 47, in area
    base_area = super().area()
  File "shapes.py", line 38, in area
    return 0.5 * self.base * self.height
AttributeError: 'RightPyramid' object has no attribute 'height'

Bạn có đoán rằng Python sẽ cố gắng gọi

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

24 không? Điều này là do một thứ gọi là thứ tự phân giải phương thức.method resolution order.

Thứ tự phân giải phương pháp

Thứ tự độ phân giải phương thức (hoặc MRO) cho Python biết cách tìm kiếm các phương thức kế thừa. Điều này có ích khi bạn sử dụng

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 vì MRO cho bạn biết chính xác nơi Python sẽ tìm kiếm một phương pháp mà bạn gọi với
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 và theo thứ tự nào.MRO) tells Python how to search for inherited methods. This comes in handy when you’re using
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 because the MRO tells you exactly where Python will look for a method you’re calling with
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 and in what order.

Mỗi lớp có một thuộc tính

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

27 cho phép chúng tôi kiểm tra đơn hàng, vì vậy hãy để Lừa làm điều đó:

>>>

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

0

Bạn có đoán rằng Python sẽ cố gắng gọi

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

24 không? Điều này là do một thứ gọi là thứ tự phân giải phương thức.

Vấn đề ở đây là thông dịch viên đang tìm kiếm

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 trong
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

08 trước
>>> square = Square(4)
>>> square.area()
16
0 và
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

# Here we declare that the Square class inherits from the Rectangle class
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)
9, và khi tìm
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 trong
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

08, Python gọi nó thay vì cái bạn muốn. Bởi vì
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

24 hy vọng sẽ có thuộc tính
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

40 và
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

41, Python ném
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

42.

May mắn thay, bạn có một số quyền kiểm soát đối với cách xây dựng MRO. Chỉ bằng cách thay đổi chữ ký của lớp

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

11, bạn có thể tìm kiếm theo thứ tự bạn muốn và các phương thức sẽ giải quyết chính xác:

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

1

Lưu ý rằng

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

11 khởi tạo một phần với
>>> square = Square(4)
>>> square.area()
16
9 từ lớp
>>> square = Square(4)
>>> square.area()
16
0. Điều này cho phép
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 sử dụng
class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
4 trên đối tượng, như được thiết kế.

Bây giờ, bạn có thể xây dựng một kim tự tháp, kiểm tra MRO và tính diện tích bề mặt:

>>>

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

2

Bạn thấy rằng MRO bây giờ là những gì bạn mong đợi, và bạn cũng có thể kiểm tra khu vực của kim tự tháp, nhờ

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 và
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

16.

Tuy nhiên, vẫn còn một vấn đề ở đây. Để đơn giản, tôi đã làm một vài điều sai trong ví dụ này: lần đầu tiên và quan trọng nhất là tôi có hai lớp riêng biệt với cùng tên và chữ ký phương thức.

Điều này gây ra các vấn đề với độ phân giải phương thức, bởi vì trường hợp đầu tiên của

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 gặp phải trong danh sách MRO sẽ được gọi.

Khi bạn sử dụng

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 với nhiều kế thừa, điều bắt buộc phải thiết kế các lớp học của bạn để hợp tác. Một phần của điều này là đảm bảo rằng các phương thức của bạn là duy nhất để chúng được giải quyết trong MRO, bằng cách đảm bảo chữ ký phương thức là duy nhất cho dù bằng cách sử dụng tên phương thức hoặc tham số phương thức.cooperate. Part of this is ensuring that your methods are unique so that they get resolved in the MRO, by making sure method signatures are unique—whether by using method names or method parameters.

Trong trường hợp này, để tránh một cuộc đại tu hoàn chỉnh của mã của bạn, bạn có thể đổi tên phương thức

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

08 Lớp ____ ____49 thành
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

55. Bằng cách này, các phương thức khu vực có thể tiếp tục sử dụng các thuộc tính lớp thay vì lấy các tham số bên ngoài:

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

3

Hãy cùng tiếp tục và sử dụng điều này trong lớp

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

11:

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

4

Vấn đề tiếp theo ở đây là mã không có đối tượng

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

08 được ủy quyền giống như đối tượng
>>> square = Square(4)
>>> square.area()
16
0, do đó, việc gọi
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

59 sẽ cung cấp cho chúng tôi
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

42 kể từ
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

41 và
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

40 don don có bất kỳ giá trị nào.

Bạn cần phải làm hai điều để khắc phục điều này:

  1. Tất cả các phương thức được gọi với

    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    9 cần phải có một cuộc gọi đến phiên bản siêu lớp của họ của phương thức đó. Điều này có nghĩa là bạn sẽ cần thêm
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    64 vào các phương thức
    >>> square = Square(4)
    >>> square.area()
    16
    
    9 của
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    08 và
    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
    
    # Here we declare that the Square class inherits from the Rectangle class
    class Square(Rectangle):
        def __init__(self, length):
            super().__init__(length, length)
    
    9.

  2. Thiết kế lại tất cả các cuộc gọi

    >>> square = Square(4)
    >>> square.area()
    16
    
    9 để lấy từ điển từ khóa. Xem mã hoàn chỉnh bên dưới.

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

5

Có một số khác biệt quan trọng trong mã này:

  • ** ________ 169 được sửa đổi ở một số nơi (chẳng hạn như ________ 170): ** Điều này sẽ cho phép người dùng của các đối tượng này chỉ khởi động chúng bằng các đối số có ý nghĩa đối với đối tượng cụ thể đó.

  • Thiết lập các đối số được đặt tên trước

    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    71: Bạn có thể thấy điều này trong
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    70. Điều này có tác dụng gọn gàng của việc bật chìa khóa đó ra khỏi từ điển
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    71, do đó đến khi kết thúc vào cuối MRO trong lớp
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    32,
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    71 trống rỗng.
    You can see this in
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    70. This has the neat effect of popping that key right out of the
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    71 dictionary, so that by the time that it ends up at the end of the MRO in the
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    32 class,
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    71 is empty.

Bây giờ, khi bạn sử dụng các lớp được cập nhật này, bạn có cái này:

>>>

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

6

Bạn thấy rằng MRO bây giờ là những gì bạn mong đợi, và bạn cũng có thể kiểm tra khu vực của kim tự tháp, nhờ

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 và
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

16.

Tuy nhiên, vẫn còn một vấn đề ở đây. Để đơn giản, tôi đã làm một vài điều sai trong ví dụ này: lần đầu tiên và quan trọng nhất là tôi có hai lớp riêng biệt với cùng tên và chữ ký phương thức.

Điều này gây ra các vấn đề với độ phân giải phương thức, bởi vì trường hợp đầu tiên của

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)

class Cube(Square):
    def surface_area(self):
        face_area = super().area()
        return face_area * 6

    def volume(self):
        face_area = super().area()
        return face_area * self.length
9 gặp phải trong danh sách MRO sẽ được gọi.

Khi bạn sử dụng

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 với nhiều kế thừa, điều bắt buộc phải thiết kế các lớp học của bạn để hợp tác. Một phần của điều này là đảm bảo rằng các phương thức của bạn là duy nhất để chúng được giải quyết trong MRO, bằng cách đảm bảo chữ ký phương thức là duy nhất cho dù bằng cách sử dụng tên phương thức hoặc tham số phương thức.composition instead of inheritance. Since this article is focused on inheritance, I won’t go into too much detail on composition and how to wield it in Python. Luckily, Real Python has published a deep-dive guide to both inheritance and composition in Python that will make you an OOP pro in no time.

Trong trường hợp này, để tránh một cuộc đại tu hoàn chỉnh của mã của bạn, bạn có thể đổi tên phương thức

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

08 Lớp ____ ____49 thành
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

55. Bằng cách này, các phương thức khu vực có thể tiếp tục sử dụng các thuộc tính lớp thay vì lấy các tham số bên ngoài:mixin.

Hãy cùng tiếp tục và sử dụng điều này trong lớp

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

11:

Vấn đề tiếp theo ở đây là mã không có đối tượng

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

08 được ủy quyền giống như đối tượng
>>> square = Square(4)
>>> square.area()
16
0, do đó, việc gọi
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

59 sẽ cung cấp cho chúng tôi
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

42 kể từ
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

41 và
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

40 don don có bất kỳ giá trị nào.

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

7

Trong ví dụ này, mã đã được làm lại để bao gồm một mixin có tên

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

77. Mixin sau đó được sử dụng bởi
>>> cube = Cube(3)
>>> cube.surface_area()
54
>>> cube.volume()
27
7 và cung cấp cho
>>> cube = Cube(3)
>>> cube.surface_area()
54
>>> cube.volume()
27
7 khả năng tính toán khối lượng của nó, được hiển thị dưới đây:

>>>

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

8

Mixin này có thể được sử dụng theo cách tương tự trong bất kỳ lớp nào khác có một khu vực được xác định cho nó và trong đó công thức

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

81 trả về âm lượng chính xác.

Một bản tóm tắt >>> square = Square(4) >>> square.area() 16 >>> rectangle = Rectangle(2,4) >>> rectangle.area() 8 9

Trong hướng dẫn này, bạn đã học được cách siêu nạp các lớp học của mình với

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9. Hành trình của bạn bắt đầu với việc xem xét về kế thừa duy nhất và sau đó chỉ ra cách gọi các phương thức siêu lớp dễ dàng với
>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9.

Sau đó, bạn đã học được cách thức kế thừa hoạt động trong Python và các kỹ thuật để kết hợp

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9 với nhiều kế thừa. Bạn cũng đã tìm hiểu về cách Python giải quyết các cuộc gọi phương thức bằng cách sử dụng thứ tự phân giải phương thức (MRO), cũng như cách kiểm tra và sửa đổi MRO để đảm bảo các phương pháp thích hợp được gọi vào thời điểm thích hợp.

Để biết thêm thông tin về lập trình hướng đối tượng trong Python và sử dụng

>>> square = Square(4)
>>> square.area()
16
>>> rectangle = Rectangle(2,4)
>>> rectangle.area()
8

9, hãy xem các tài nguyên này:

  • Tài liệu chính thức
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    9
  • Python sườn
    >>> square = Square(4)
    >>> square.area()
    16
    >>> rectangle = Rectangle(2,4)
    >>> rectangle.area()
    8
    
    
    9 được coi là siêu
  • Lập trình hướng đối tượng trong Python 3

Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: siêu tải các lớp của bạn với Python Super () This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Supercharge Your Classes With Python super()

Super () hoạt động như thế nào trong Python?

Hàm Super () trong Python làm cho kế thừa lớp trở nên dễ quản lý và có thể mở rộng hơn. Hàm trả về một đối tượng tạm thời cho phép tham chiếu đến lớp cha bằng từ khóa Super. Hàm Super () có hai trường hợp sử dụng chính: để tránh việc sử dụng lớp siêu (cha mẹ) một cách rõ ràng.The function returns a temporary object that allows reference to a parent class by the keyword super. The super() function has two major use cases: To avoid the usage of the super (parent) class explicitly.

Super () có cần thiết Python không?

Nói chung nó là cần thiết.Và nó thường cần thiết để nó là cuộc gọi đầu tiên trong ban đầu của bạn.Đầu tiên nó gọi chức năng INIT của lớp cha (dict).Nó thường tạo ra cấu trúc dữ liệu cơ bản của nó.. And it's often necessary for it to be the first call in your init. It first calls the init function of the parent class ( dict ). It typically creates its underlying data structure.

Điều gì sẽ xảy ra nếu chúng ta không gọi Super () từ lớp con?

Nếu chúng ta gọi "Super ()" mà không có bất kỳ siêu lớp nào thực sự, sẽ không có gì được hiển thị.Vì lớp có tên đối tượng là siêu lớp của tất cả các lớp trong Java.Nếu bạn gọi "Super ()" mà không có bất kỳ siêu lớp nào, bên trong, hàm tạo mặc định của lớp đối tượng sẽ được gọi (không hiển thị gì).nothing will be displayed. Since the class named Object is the superclass of all classes in Java. If you call "super()" without any superclass, Internally, the default constructor of the Object class will be invoked (which displays nothing).

Super được gọi là Java tự động?

Với Super (danh sách tham số), hàm tạo siêu lớp với danh sách tham số phù hợp được gọi.Lưu ý: Nếu một hàm tạo không gọi một hàm tạo siêu lớp rõ ràng, trình biên dịch Java sẽ tự động chèn một cuộc gọi đến hàm tạo không có đối số của siêu lớp.If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass.