回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我是Python的初学者,使用Lutz的书来理解<code>classmethod</code>、<code>staticmethod</code>和{<cd3>}。此代码的目标是通过计算创建的实例数来了解<code>cls</code>、<code>self</code>和直接类调用(<code>Spam1.numInstances</code>)之间的区别。在</p>
<p>这是一个从书中衍生出来的例子。我不确定为什么父类(<code>Spam1</code>)属性(<code>numInstances</code>)在通过<code>Sub1</code>和<code>Other1</code>调用时不递增。在</p>
<p>我的代码是:</p>
<pre><code>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)
</code></pre>
<p>我花了一天时间来调试这段代码,但我不明白<code>cls.numInstances</code>是如何工作的,因为PyCharm在调试模式下会对<code>cls.numInstances</code>显示“no reference”。由于沮丧,我读了一些这样的帖子:<a href="https://stackoverflow.com/questions/24799403/what-does-cls-function-do-inside-a-class-method">What does cls() function do inside a class method?</a>,<a href="https://stackoverflow.com/questions/4613000/what-is-the-cls-variable-used-for-in-python-classes">What is the 'cls' variable used for in Python classes?</a>,和{a3},但我不明白到底发生了什么。在</p>
<p>具体来说,我的问题是:</p>
<p><strong>a)为什么在创建<code>d</code>、<code>e</code>和{<cd16>}时,<code>Spam1.numInstances</code>没有增加?</strong></p>
<p>我想回答这个问题:</p>
<p>我的理解是<code>cls</code>用于访问类属性。对于<code>d</code>和<code>e</code>,使用<code>self.numInstances</code>访问实例属性,因为<code>Sub1</code>将<code>Spam1</code>继承的属性<code>numInstances</code>的值归零。<code>cls</code>访问<code>Sub1</code>的class属性,这与<code>Sub1</code>类的属性相同。因此,我们在输出中看到的<code>self</code>和{<cd4>}值分别是<code>Sub1</code>实例和类。我的理解正确吗?</em></p>
<p><em>a.ii)<code>f</code>从<code>Spam1</code>继承{<cd8>}。因此,<code>self.numInstances</code>和{<cd11>}取<code>Spam1</code>中的值。它们的值是递增的,但不是<code>Spam1</code>,因为<code>cls</code>引用<code>Other1</code>,因为{<cd5>}引用{<cd16>},这是{<cd10>}的对象。因此,<code>Spam1</code>的<code>numInstances</code>永远不会被触摸。</em></p>
<p><strong>b)我对<code>self.numInstances</code>、<code>cls.numInstances</code>和{<cd6>}之间的差异的理解正确吗?如果没有,有人能解释一下吗?</strong></p>
<p>我认为我的问题很基本。我希望有人能帮我。我迷路了。在</p>