Hướng dẫn does python call super constructor? - python có gọi hàm tạo siêu không?

class A:
    def __init__(self):
        print("world")

class B(A):
    def __init__(self):
       print("hello")

B()  # output: hello

Trong tất cả các ngôn ngữ khác, tôi đã làm việc với Super Constructor được gọi ngầm. Làm thế nào để một người gọi nó trong Python? Tôi sẽ mong đợi

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
0 nhưng điều này không hoạt động.

Hướng dẫn does python call super constructor? - python có gọi hàm tạo siêu không?

lưu lượng

23.2K15 Huy hiệu vàng96 Huy hiệu bạc154 Huy hiệu đồng15 gold badges96 silver badges154 bronze badges

hỏi ngày 8 tháng 3 năm 2010 lúc 4:35Mar 8, 2010 at 4:35

5

Theo các câu trả lời khác, có nhiều cách để gọi các phương thức siêu lớp (bao gồm cả hàm tạo), tuy nhiên trong Python-3.x, quá trình đã được đơn giản hóa:

Python-3.x

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()

Python-2.x

Trong Python 2.x, bạn phải gọi phiên bản dài dòng hơn một chút

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
1, tương đương với
class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
2AS trên mỗi tài liệu.

class A(object):
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"
   super(B, self).__init__()

Hướng dẫn does python call super constructor? - python có gọi hàm tạo siêu không?

Tế bào thần kinh

4.6924 Huy hiệu vàng33 Huy hiệu bạc54 Huy hiệu đồng4 gold badges33 silver badges54 bronze badges

Đã trả lời ngày 17 tháng 10 năm 2015 lúc 20:17Oct 17, 2015 at 20:17

Hướng dẫn does python call super constructor? - python có gọi hàm tạo siêu không?

Aidan Gomezaidan GomezAidan Gomez

7.7075 Huy hiệu vàng26 Huy hiệu bạc 50 Huy hiệu Đồng5 gold badges26 silver badges50 bronze badges

0

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
2 Trả về một đối tượng giống cha mẹ trong các lớp kiểu mới:

class A(object):
    def __init__(self):
        print("world")

class B(A):
    def __init__(self):
        print("hello")
        super(B, self).__init__()

B()

Hướng dẫn does python call super constructor? - python có gọi hàm tạo siêu không?

kaya3

43.5K4 Huy hiệu vàng55 Huy hiệu bạc86 Huy hiệu Đồng4 gold badges55 silver badges86 bronze badges

Đã trả lời ngày 8 tháng 3 năm 2010 lúc 4:43Mar 8, 2010 at 4:43

19

Với các lớp Python 2.x kiểu cũ, đó sẽ là:

class A: 
 def __init__(self): 
   print "world" 

class B(A): 
 def __init__(self): 
   print "hello" 
   A.__init__(self)

Đã trả lời ngày 8 tháng 3 năm 2010 lúc 4:48Mar 8, 2010 at 4:48

GabegabeGabe

83.6K12 Huy hiệu vàng136 Huy hiệu bạc233 Huy hiệu Đồng12 gold badges136 silver badges233 bronze badges

2

Một cách là gọi hàm tạo của A và vượt qua

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
4 như một đối số, như vậy:

class B(A):
    def __init__(self):
        A.__init__(self)
        print "hello"

Ưu điểm của phong cách này là nó rất rõ ràng. Nó gọi là người khởi đầu của A. Nhược điểm là nó không xử lý được sự kế thừa hình kim cương rất tốt, vì cuối cùng bạn có thể gọi người khởi đầu của lớp cơ sở được chia sẻ hai lần.

Một cách khác là sử dụng Super (), như những người khác đã chỉ ra. Đối với khả năng tự nhiên, về cơ bản, điều tương tự như cho phép bạn gọi cho người khởi đầu của cha mẹ.

Tuy nhiên, Super () khá phức tạp hơn một chút và đôi khi có thể phản trực giác trong nhiều tình huống thừa kế. Về mặt tích cực, Super () có thể được sử dụng để xử lý kế thừa hình kim cương. Nếu bạn muốn biết nitty-gritty về những gì Super () làm, thì lời giải thích tốt nhất tôi đã tìm thấy cho cách Super () hoạt động ở đây (mặc dù tôi không nhất thiết phải chứng thực ý kiến ​​của bài viết đó).

mũi to

28.6K14 Huy hiệu vàng73 Huy hiệu bạc108 Huy hiệu đồng14 gold badges73 silver badges108 bronze badges

Đã trả lời ngày 8 tháng 3 năm 2010 lúc 5:01Mar 8, 2010 at 5:01

Daniel Stutzbachdaniel StutzbachDaniel Stutzbach

71.8K17 Huy hiệu vàng85 Huy hiệu bạc76 Huy hiệu đồng17 gold badges85 silver badges76 bronze badges

2

Câu trả lời ngắn

super(DerivedClass, self).__init__()

Câu trả lời dài

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
2 làm gì?

Nó lấy tên lớp được chỉ định, tìm các lớp cơ sở của nó (Python cho phép nhiều kế thừa) và tìm phương pháp (

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
6 trong trường hợp này) trong mỗi chúng từ trái sang phải. Ngay khi tìm thấy phương thức có sẵn, nó sẽ gọi nó và kết thúc tìm kiếm.

Làm cách nào để gọi INTING của tất cả các lớp cơ sở?

Trên đây hoạt động nếu bạn chỉ có một lớp cơ sở. Nhưng Python cho phép nhiều kế thừa và bạn có thể muốn đảm bảo tất cả các lớp cơ sở được khởi tạo đúng. Để làm điều đó, bạn nên có mỗi lần gọi lớp cơ sở:

class Base1:
  def __init__():
    super(Base1, self).__init__()

class Base2:
  def __init__():
    super(Base2, self).__init__()

class Derived(Base1, Base2):
  def __init__():
    super(Derived, self).__init__()

Điều gì sẽ xảy ra nếu tôi quên gọi init cho Super?

Hàm tạo (

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
7) được gọi trong một chuỗi (như trong C ++ và Java). Khi thể hiện được tạo, chỉ có bộ khởi tạo của trường hợp đó (
class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
6) được gọi, mà không có bất kỳ chuỗi ngầm nào đối với siêu lớp của nó.

mũi to

28.6K14 Huy hiệu vàng73 Huy hiệu bạc108 Huy hiệu đồng14 gold badges73 silver badges108 bronze badges

Đã trả lời ngày 8 tháng 3 năm 2010 lúc 5:01Nov 28, 2018 at 2:39

Hướng dẫn does python call super constructor? - python có gọi hàm tạo siêu không?

Daniel Stutzbachdaniel StutzbachShital Shah

71.8K17 Huy hiệu vàng85 Huy hiệu bạc76 Huy hiệu đồng13 gold badges224 silver badges180 bronze badges

2

Câu trả lời ngắn

class B(A):
    def __init__(self, x, y, z):
        A.__init__(self, x, y)

Câu trả lời dàiinit of the superclass A with a reference to the current subclass instance (self) and then the list of expected arguments.

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
2 làm gì?Jul 31, 2019 at 9:49

Hướng dẫn does python call super constructor? - python có gọi hàm tạo siêu không?

gal007gal007gal007

Nó lấy tên lớp được chỉ định, tìm các lớp cơ sở của nó (Python cho phép nhiều kế thừa) và tìm phương pháp (

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()
6 trong trường hợp này) trong mỗi chúng từ trái sang phải. Ngay khi tìm thấy phương thức có sẵn, nó sẽ gọi nó và kết thúc tìm kiếm.6 gold badges46 silver badges66 bronze badges

1

Làm cách nào để gọi INTING của tất cả các lớp cơ sở?

class A(object):
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"
   super(self.__class__, self).__init__()

B()

Trên đây hoạt động nếu bạn chỉ có một lớp cơ sở. Nhưng Python cho phép nhiều kế thừa và bạn có thể muốn đảm bảo tất cả các lớp cơ sở được khởi tạo đúng. Để làm điều đó, bạn nên có mỗi lần gọi lớp cơ sở:

mũi to

28.6K14 Huy hiệu vàng73 Huy hiệu bạc108 Huy hiệu đồng14 gold badges73 silver badges108 bronze badges

Đã trả lời ngày 8 tháng 3 năm 2010 lúc 5:01Nov 20, 2015 at 10:46

2

Python có tự động gọi Super Constructor không?

Về cơ bản, Phái đoàn Super-Class của trình khởi tạo không tự động trong Python vì chính xác những lý do tương tự của phái đoàn đó cũng không tự động cho bất kỳ phương pháp nào khác-và lưu ý rằng các "ngôn ngữ khác" không thực hiện ủy quyền siêu tự động cho bất kỳ Phương pháp khác ... chỉ cho hàm tạo (và nếu ...super-class delegation of the initializer is not automatic in Python for exactly the same reasons such delegation is also not automatic for any other methods -- and note that those "other languages" don't do automatic super-class delegation for any other method either... just for the constructor (and if ...

Có phải Super Constructor luôn được gọi?

Super Class Constructor luôn được gọi trong quá trình xây dựng và đảm bảo rằng việc xây dựng siêu lớp được hoàn thành trước khi hàm tạo phân lớp được gọi.Đây là trường hợp cho hầu hết nếu không phải tất cả các ngôn ngữ định hướng đối tượng. and it's guaranteed that super class construction is finished before subclass constructor is called. This is the case for most if not all the object oriented language.

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.

Python có siêu không?

Định nghĩa và cách sử dụng.Hàm Super () được sử dụng để cung 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 anh chị em.Hàm Super () trả về một đối tượng đại diện cho lớp cha.The super() function is used to give access to methods and properties of a parent or sibling class. The super() function returns an object that represents the parent class.