我正在练习python类。我知道类变量在所有实例之间共享,而实例变量属于每个对象,因此需要为每个实例定义。在以下类中,如果引用变量raise_amount,则如果我这样写最后一行代码:commons-dbcp
,其行为是相同的。
如果有的话,这两种情况有什么区别?
self.pay = int(self.pay * Employee.raise_amount)
答案 0 :(得分:1)
我认为您指的是self.raise_amount。如果您拥有它,那么python必须首先查找实例变量,如果找不到,它将查找名称相似的类变量,并将其副本创建为实例变量并使用它。如果您随后要更改self.raise数量,则仅适用于该实例,而不适用于该类创建的任何其他实例。
尝试创建该类的实例,并在其上使用apply_raise方法。然后尝试将raise_amount类变量更改为2.0之类,然后再次在实例上调用该方法。您应该看到的是,该数量仅增加了1.04倍,而不是2。这是因为它使用了您第一次运行该方法时创建的实例值。
注意:原始帖子已被编辑以更改为使用班级名称作为加薪金额。这篇帖子是对self.raise_amount的回复。
答案 1 :(得分:1)
对表达式v.GetValue<int>()
的查找通常会很复杂,因为我们可以在不涉及任何方法或描述符的情况下将其简化。
如果self.raise_amount
有一个名为self
的实例属性,则返回该属性的值。
否则,我们开始寻找 class 属性,从raise_amount
的直接类型(此处为self
)开始。由于定义了Employee
,我们得到了该值...
...但是如果未定义Employee.raise_amount
怎么办?我们将按照方法Employee.raise_amount
的方法解析顺序转到下一个类,即Employee
。由于未定义object
,因此将引发object.raise_amount
。