試圖理解python中的oop我進入這種困惑我的情況,我無法找到令人滿意的解釋... 我正在構建一個Countable類,它有一個計數器屬性,用於統計該類的多少個實例已被初始化。我想要在給定類的子類(或子類)初始化時增加此計數器。下面是我的實現:python中的類變量的繼承
class Countable(object):
counter = 0
def __new__(cls, *args, **kwargs):
cls.increment_counter()
count(cls)
return object.__new__(cls, *args, **kwargs)
@classmethod
def increment_counter(cls):
cls.counter += 1
if cls.__base__ is not object:
cls.__base__.increment_counter()
其中count(cls)
是有調試的目的,後來我把它寫下來。
現在,讓我們有這樣一些子類:
class A(Countable):
def __init__(self, a='a'):
self.a = a
class B(Countable):
def __init__(self, b='b'):
self.b = b
class B2(B):
def __init__(self, b2='b2'):
self.b2 = b2
def count(cls):
print('@{:<5} Countables: {} As: {} Bs: {} B2s: {}'
''.format(cls.__name__, Countable.counter, A.counter, B.counter, B2.counter))
當我運行類似下面的代碼:
a = A()
a = A()
a = A()
b = B()
b = B()
a = A()
b2 = B2()
b2 = B2()
我得到下面的輸出,這看起來很奇怪對我說:
@A Countables: 1 As: 1 Bs: 1 B2s: 1
@A Countables: 2 As: 2 Bs: 2 B2s: 2
@A Countables: 3 As: 3 Bs: 3 B2s: 3
@B Countables: 4 As: 3 Bs: 4 B2s: 4
@B Countables: 5 As: 3 Bs: 5 B2s: 5
@A Countables: 6 As: 4 Bs: 5 B2s: 5
@B2 Countables: 7 As: 4 Bs: 6 B2s: 6
@B2 Countables: 8 As: 4 Bs: 7 B2s: 7
爲什麼在開始時A和B的計數器都在遞增,儘管我只打電話給A()
?爲什麼在我第一次打電話B()
後,它的行爲如預期般?
我已經發現有一個像我想要的行爲就足夠在每個子類中添加counter = 0
,但我無法找到解釋爲什麼它的行爲如此....謝謝!
我添加了幾個調試打印,並且爲了簡單起見,限制類創建爲兩個。這是很奇怪:
>>> a = A()
<class '__main__.A'> incrementing
increment parent of <class '__main__.A'> as well
<class '__main__.Countable'> incrementing
@A Counters: 1 As: 1 Bs: 1 B2s: 1
>>> B.counter
1
>>> B.counter is A.counter
True
>>> b = B()
<class '__main__.B'> incrementing
increment parent of <class '__main__.B'> as well
<class '__main__.Countable'> incrementing
@B Counters: 2 As: 1 Bs: 2 B2s: 2
>>> B.counter is A.counter
False
爲什麼當B()尚未初始化,它指向相同的變量A.counter但創建一個對象後,這是一個不同?
我無法重現你的輸出。我的'B2s'輸出總是和'Bs'一樣。 –
我用這個問題的簡單例子編輯了你的問題。這是一個有趣的問題,希望有人能對這個過程有所瞭解 – Vinny
@Rawing你是對的,我粘貼另一個例子的輸出......現在我修復它! –