由于函式多載,我不能在一個類中有 2 個 init 方法。但是,為什么有可能在初始化子類的時候,無法定義一個新__init__的方法,在子類的方法中使用該super().__init__方法或者父類的init__init__方法。我__init__對同時運行的兩種方法的概念有點困惑
class Employee:
emps = 0
def __init__(self,name,age,pay):
self.name = name
self.age = age
self.pay = pay
class Developer(Employee):
def __init__(self,name,age,pay,level):
Employee.__init__(self,name,age,pay)
self.level = level
uj5u.com熱心網友回復:
“ init ”是 python 類中的保留方法。它在面向物件的術語中被稱為建構式。呼叫此方法時,允許類初始化類的屬性。
#base class
class State():
def __init__(self):
print("In the state class")
self.state1= "Main State"
#derived class
class HappyState():
def __init__(self):
print("In the happystate class")
self.state2= "Happy State"
super().__init__()
a=HappyState()
print(a.state1)
print(a.state2)
super() 函式允許我們避免顯式使用基類名稱。在 Python 中,super() 函式是動態呼叫的,這與其他語言不同,因為它是一種動態語言。super() 函式回傳一個代表父類的物件。在子類中,可以使用 super() 函式參考父類。它回傳超類的臨時物件,這允許訪問其子類的所有方法。使用 super() 關鍵字時,我們無需指定父類名稱即可訪問其方法。
#base class1
class State():
def __init__(self):
print("In the State class")
self.state1= "Main State"
#base class2
class Event():
def __init__(self):
print("In the Event class")
self.event= "Main Event"
#derived class
class HappyState(State,Event):
def __init__(self):
print("In the happystate class")
super().__init__() #Only calls Base Class 1
a=HappyState()
看更多
uj5u.com熱心網友回復:
由于函式多載,我不能在一個類中有 2 個 init 方法。
部分正確。同一個類中不能有 2 個__init__方法,因為該語言缺少函式多載。(庫可以部分恢復有限形式的函式多載;請參閱示例。)functools.singledispatchmethod
我對 2 個init方法同時運行的概念有點困惑
但你不是想超載__init__. 您正在重寫 ,為它繼承的定義__init__提供不同的定義。(事實上??,也是覆寫,使用它自己的定義代替它從 繼承的定義。)每個類只有一個定義。DeveloperEmployerEmployer__init__object
在您對 的定義中,您只是在對同一物件執行 - 特定初始化之前,Developer.__init__簡單地顯式呼叫繼承方法以執行對所有實體通用的初始化。EmployeeDeveloper
使用super,您正在使用一種動態查找的形式來讓方法決議順序決定例如可以呼叫Developer的“下一個”版本。對于單繼承,好處只不過是避免了對. 但是對于多重繼承,對于確保所有繼承的方法(包括您知道的和您可能不知道的)都被呼叫,更重要的是,以正確的順序呼叫是至關重要的。__init__DeveloperEmployeesuper
關于如何正確使用的完整討論super超出了這個問題的范圍,我認為,但我會展示你重寫的兩個類以充分利用super,并向你推薦 Pythonsuper()被認為是超級的!了解更多資訊。
# Main rules:
# 1. *All* classes use super().__init__, even if you are only inheriting
# from object, because you don't know who will use you as a base class.
# 2. __init__ should use keyword arguments, and be prepared to accept any
# keyword arguments.
# 3. All keyword arguments that don't get assigned to your own parameters
# are passed on to an inherited __init__() to process.
class Employee:
emps = 0
def __init__(self, *, name, age, pay, **kwargs):
super().__init__(**kwargs)
self.name = name
self.age = age
self.pay = pay
class Developer(Employee):
def __init__(self, *, level, **kwargs):
super().__init__(**kwargs)
self.level = level
d1 = Developer(name="Alice", age=30, pay=85000, level=1)
為了激發您對鏈接文章的興趣,請考慮
class A:
def __init__(self, *, x, **kwargs):
super().__init__(**kwargs)
self.x = x
class B:
def __init__(self, *, y, **kwargs):
super().__init__(**kwargs)
self.y = y
class C1(A, B):
pass
class C2(B, A):
pass
c1 = C1(x=1, y=2)
c2 = C2(x=4, y=3)
assert c1.x == 1 and c1.y == 2
assert c2.x == 4 and c2.y == 3
斷言全部通過,并且在創建A.__init__和B.__init__時都按預期呼叫。c1c2
uj5u.com熱心網友回復:
該super()函式用于訪問父類或兄弟類的方法和屬性
查看:https ://www.geeksforgeeks.org/python-super/
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/537511.html
下一篇:Go中的介面管理
