如何將 self.value 1 和 self.value 2 添加到 VALUES 中。這就是目的如何將“self.value1”和“self.value2”添加到元類中的VALUES串列中
class Meta(type):
VALUES = dict()
def __new__(mcs, name, bases, attrs):
for k, v in attrs.items():
print(k, v)
return super(Meta, mcs).__new__(mcs, name, bases, attrs)
class A(metaclass=Meta):
def __init__(self):
self.value1 = "Class A"
class B(metaclass=Meta):
def __init__(self):
self.value2 = "Class B"
class Main(A, B):
def __init__(self):
super(Main, self).__init__()
m = Main()
print(m.__dict__)
我想要的輸出 {'value1': 'Class A',"value2":"Class B"}
uj5u.com熱心網友回復:
這是因為當您呼叫 super() 函式時,它不會呼叫該函式的所有實體,只會呼叫它找到的第一個實體。因為您的類定義在繼承 B 之前繼承了 A,所以要搜索的第一個類是類 A。程式在類 A 中找到init函式,因此它執行該函式然后回傳。如果改為撰寫class Main(B, A):,則輸出將是{"value2":"Class B"},因為 B 類在搜索順序中比 A 類高。
要解決您遇到的問題,您必須運行所有繼承類的init函式,例如:
class Main(A, B):
def __init__(self):
for cls in Main.__bases__:
cls.__init__(self)
這從bases屬性中獲取每個父類的參考并直接呼叫它們的init,這意味著它是從每個父類呼叫的,而不僅僅是最高優先級的。我不確定這是否是最佳實踐,甚至是否明智,但它應該是您描述的問題。
uj5u.com熱心網友回復:
super旨在由層次結構中的所有類協作使用。(忽略元類,因為它與請求的結果無關。)
class A:
def __init__(self. **kwargs):
super().__init__(**kwargs)
self.value1 = "Class A"
class B:
def __init__(self. **kwargs):
super().__init__(**kwargs)
self.value2 = "Class B"
class Main(A, B):
pass
m = Main()
由于Main.__init__未定義,因此首先__init__呼叫 MRO 中找到的第一個方法,即A.__init__. A.__init__然后使用super()to call B.__init__,它使用super()to call object.__init__,這是鏈中的最后一個方法,因為object.__init__它本身不使用super。
請注意這兩個A和B使用super不知道哪一個類的__init__方法將被未來使用。這是由作為 傳遞的物件的型別決定的self,而不是由類決定的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/403390.html
標籤:
