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.
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__[]
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
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[]
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
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
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 [
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 badgesclass A[object]:
def __init__[self]:
print["world"]
class B[A]:
def __init__[self]:
print["hello"]
super[].__init__[]
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