python - Python中的类变量和实例变量
问题描述
我正在练习python课程。我知道类变量在所有实例之间共享,而实例变量属于每个对象,因此需要为每个实例定义。在下面的类中,参考变量 raise_amount,如果我这样写最后一行代码:self.pay = int(self.pay * Employee.raise_amount)
,行为是相同的。
如果有的话,这两种情况有什么区别?
class Employee:
raise_amount = 1.04
def __init__(self ,first ,last ,pay ):
self.first = first
self.last = last
self.pay = pay
self.email = first+"."+last+"@company.com"
def apply_raise(self): #but this is not an attribute
self.pay = int(self.pay * self.raise_amount)
#or self.pay = int(self.pay * Employee.raise_amount)
解决方案
我假设您指的是 self.raise_amount。在你拥有它的情况下,python 必须首先查找实例变量,如果没有找到,它会查找类似命名的类变量,并将它的副本创建为实例变量并使用它。如果您要更改 self.raise 数量,则仅适用于该实例,而不适用于该类的任何其他实例。
尝试创建该类的实例并在其上使用 apply_raise 方法。然后尝试将 raise_amount 类变量更改为 2.0 并再次调用实例上的方法。您应该看到的是数量只增加了 1.04 倍,而不是 2。那是因为它使用了在您第一次运行该方法时创建的实例值。
注意:原始帖子已被编辑以更改为使用班级名称作为加薪金额。这篇文章是 self.raise_amount 时的回复。
推荐阅读
- sql-server - TSQL:如果日期介于当年日期之间,如何更改日期?
- c++ - 没有构造函数的实例与参数列表匹配,但我将一个 nullptr 传递给一个接受指针和默认值的构造函数
- powershell - Set-ADGroup : 指定了无效的 dn 语法
- ruby-on-rails - RSpec ActiveStorage:错误 ActiveRecord::RecordNotFound:找不到带有“id”的 ActiveStorage::Blob
- r - 在 R 中,read.table 在特定的开始字符串上返回错误
- algorithm - 图表和 MST,一些事实和有效性
- javascript - 从子组件设置父状态
- redis - 错误:连接 ECONNREFUSED 127.0.0.1:6379
- ios - 如果我点击通知 QuickBlox 视频通话未显示,因为根视图控制器更改了我们将如何再次在 ios swift 中显示视频通话
- javascript - XMLHttpRequest 包含非空响应,但 XMLHttpRequest.response 是