python cls和self_python中cls与self与类调用
我是Python的初學者,使用Lutz的書來理解classmethod、staticmethod和{}。此代碼的目標是通過計算創建的實例數來了解cls、self和直接類調用(Spam1.numInstances)之間的區別。在
這是一個從書中衍生出來的例子。我不確定為什么父類(Spam1)屬性(numInstances)在通過Sub1和Other1調用時不遞增。在
我的代碼是:class Spam1:
numInstances = 0
def count(cls):
cls.numInstances += 1
print("In count -> number of instances: cls, Spam", cls.numInstances, Spam1.numInstances)
def __init__(self):
print("-----")
print("In init, before -> number of instances: self, Spam",self.numInstances,Spam1.numInstances )
self.count()
print("In init, after -> number of instances: self, Spam",self.numInstances,Spam1.numInstances )
print("-----")
count=classmethod(count)
class Sub1(Spam1):
numInstances = 0
class Other1(Spam1):
pass
a=Spam1() #Output after increment: 1,1,1 (self, cls, Spam1)
b=Spam1() #Output after increment: 2,2,2 (self, cls, Spam1)
c=Spam1() #Output after increment: 3,3,3 (self, cls, Spam1)
d=Sub1() #Output after increment: 1,1,3 (self, cls, Spam1)
e=Sub1() #Output after increment: 2,2,3 (self, cls, Spam1)
f=Other1() #Output after increment: 4,4,3 (self, cls, Spam1)
我花了一天時間來調試這段代碼,但我不明白cls.numInstances是如何工作的,因為PyCharm在調試模式下會對cls.numInstances顯示“no reference”。由于沮喪,我讀了一些這樣的帖子:What does cls() function do inside a class method?,What is the 'cls' variable used for in Python classes?,和{a3},但我不明白到底發生了什么。在
具體來說,我的問題是:
a)為什么在創建d、e和{}時,Spam1.numInstances沒有增加?
我想回答這個問題:
我的理解是cls用于訪問類屬性。對于d和e,使用self.numInstances訪問實例屬性,因為Sub1將Spam1繼承的屬性numInstances的值歸零。cls訪問Sub1的class屬性,這與Sub1類的屬性相同。因此,我們在輸出中看到的self和{}值分別是Sub1實例和類。我的理解正確嗎?
a.ii)f從Spam1繼承{}。因此,self.numInstances和{}取Spam1中的值。它們的值是遞增的,但不是Spam1,因為cls引用Other1,因為{}引用{},這是{}的對象。因此,Spam1的numInstances永遠不會被觸摸。
b)我對self.numInstances、cls.numInstances和{}之間的差異的理解正確嗎?如果沒有,有人能解釋一下嗎?
我認為我的問題很基本。我希望有人能幫我。我迷路了。在
總結
以上是生活随笔為你收集整理的python cls和self_python中cls与self与类调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java项目有个x_GitHub - s
- 下一篇: AUTOSAR架构深度解析