我是 python 類的新手。我搜索并瀏覽了很多關于super()方法的文章,這造成了很多混亂。
型別 - 1
class Square():
def __init__(self,side):
self.side = side
print("Its confusing")
super().__init__()
def area(self):
return self.side * self.side
c = Square()
print(c.area())
在Type - 1 中,如果我提到它有super().__init__()什么用?我不明白為什么我們super().__init__()在一個不是從任何其他類繼承的新創建的類中使用。我不明白它在這里做什么。
如果我們在分配后給self.side = side它,它會正常運行并被執行。
型別 - 2
class Square():
def __init__(self):
# self.side = side
# print("Its confusing")
super().__init__()
e = Square()
e()
如果我只super().__init__()在里面__init__給出它就會出錯。
TypeError: 'Square' object is not callable
我的疑問是:
1.我們可以 super().__init__()在新創建的類中使用嗎?它運行良好,沒有錯誤。
2.那為什么只放里面Type-2會拋出錯誤呢?super().__init__()__init__
你能用簡單的詞來表達嗎?
uj5u.com熱心網友回復:
對于type-1因為Square類沒有從任何基類繼承,然后呼叫super().__init__()實際上什么也不做。
但是,保留此代碼仍然很好,以防您使用 Square 類進行多重繼承。另一個問題中有一個示例,請參見此處:https : //stackoverflow.com/a/8613067/362792。所以復制那個例子,假設你有類 Square、類 Color 和類 ColoredSquare:
class ColoredSquare(Square, Color):
...
在這種情況下,當創建 ColoredSquare 實體時,super().__init__()from Square 實際上是在呼叫Color.__init__()方法。所以那確實是有必要的。
對于type-2,您的錯誤不是來自 init 方法。相反,它實際上e()是在為“TypeError: 'Square' object is not callable”產生錯誤。
要以這種方式使用物件,您需要有 call 方法。例如。
class Square():
def __init__(self):
super().__init__()
def __call__(self):
print('call for square')
e = Square()
e()
uj5u.com熱心網友回復:
繼承用于回收代碼……而您用于super“獲取”父類中定義的代碼。
# parent class
class Parallelogram:
def __init__(self, side1, side2):
self.side1, self.side2 = side1, side2
def area(self):
return self.side1 * self.side2
# child class
class Square(Parallelogram):
def __init__(self, side):
super().__init__(side, side)
p = Parallelogram(2, 3)
print(p.area())
# 6
s = Square(4)
print(s.area())
# 16
print(issubclass(Parallelogram, object))
#True
print(issubclass(Square, Parallelogram))
#True
print(hasattr(Square, 'area')) # inherited from the parent
True
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/314641.html
