我不確定這個問題是否正確,可能繼承只在實體中起作用。
我提供了下面的代碼,我們使用基于python描述符的方法來計算創建了多少個X實體,其中X是修改了繼承的靜態變數。
class X。
def __set_name__(self, owner, name)。
owner.howManyX.append(name)
class Base:
howManyX = []
class A(Base)。
a1 = X()
a2 = X()
class B(Base)。
b1 = X()
b2 = X()
print(id(A.howManyX), A.howManyX )
print(id(B.howManyX), B.howManyX)
print(id(Base.howManyX),Base.howManyX)
因為A和B類都應該繼承Base類howManyX。但輸出結果有點出乎意料,因為下面顯示的變數似乎是相同的。
139852096097856 ['a1'/span>, 'a2'/span>, 'b1'/span>, 'b2']
139852096097856 ['a1'/span>, 'a2'/span>, 'b1'/span>, 'b2'/span>]
139852096097856 ['a1'/span>, 'a2'/span>, 'b1'/span>, 'b2'/span>]
uj5u.com熱心網友回復:
這是繼承。A和B從Base中繼承了同一個屬性,并且突變了它所指的物件。
你想要的是相反的繼承,你想要在每個子類中覆寫 howManyX = [],所以每個類得到它的自己的屬性指向一個不同的物件。
注意,你可以使用一個實體得到完全相同的行為:
>>> class Foo。
...。 bar = []
...
>>> foo1 = Foo()
>>> foo2 = Foo()
>>> foo1.bar.append('baz')
>>> foo2.bar.append('bing')
>>> Foo.bar 是 foo1.bar 是 foo2.bar
真
>>> Foo.bar, foo1.bar, foo2.bar
(['baz', 'bing'], ['baz', 'bing'], ['baz', 'bing'])
在Python中,所有的繼承意味著當你查找某個屬性時,some_obj.some_attribute,你在你繼承的命名空間中查找該屬性。因此,如果.some_attribute在some_obj中被查詢,而它沒有被找到,那么,類的命名空間,以及方法決議順序中的所有類都被查詢(按順序)。
如果some_obj本身是一個類,你將跳過任何實體的查找,而直接前往類的命名空間和方法決議順序中的命名空間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/320066.html
標籤:
上一篇:如何獲取一個視窗的UI元素?迅捷
下一篇:ExtJS繼承配置
