我正在尝试增加一个名为";lastIdentification";在__init__
和我做不到。
class Agent:
lastIdentify = 0
def __init__(self,name,tel,age,gender='ND'):
global lastIdentify
lastIdentify += 1
self._identify = lastIdentify
我还试图删除全球声明,但什么也没发生。
我有以下错误:文件"//A/Agent.py";,第10行,在initlastIdentity+=1中名称错误:名称"lastIdentification"未定义
谢谢!
因此,正如Barmar所想,您心中有一个类变量。
这里棘手的部分是:Python有可变数据(列表、字典、集合…(和不可变数据(int、float、string…(
当您修改类级别的不可变变量时,您可以将其复制并绑定到实例的作用域/命名空间。这就是badlastIdentify
上正在发生的事情。
另一方面,如果你开始改变类范围的可变属性,例如列表,你会发现你正在修改类级别的变量,即你的列表会变得更大,即使这不是你想要的。
而且,在您的原始代码中,global lastIdentify
又是一个东西:它以前不存在,不能递增,并且与您的类没有关系。一般来说,global
作为Python中的一个关键字有点代码味,它通常以不同的方式处理得更好。而且,不,我并不是一个对全球和单身人士的糟糕感到虔诚的人,尤其是在使用global
的时候。
class Agent:
lastIdentify = 0
badlastIdentify = 0
def __init__(self,name,tel,age,gender='ND'):
# you are operating on the class namespace,
#not on an instance-specific variable
self.__class__.lastIdentify += 1
#this doesnt "mutate" the class-variable
#it binds a new copy of it, +1, to this instance
self.badlastIdentify += 1
agent99 = Agent(1,2,3,4)
agent007 = Agent(1,2,3,4)
print(f"{agent99.badlastIdentify=} , {agent99.lastIdentify=} ")
print(f"{agent007.badlastIdentify=} , {agent007.lastIdentify=} " )
print(f"{Agent.badlastIdentify=} {Agent.lastIdentify=} ")
输出:
agent99.badlastIdentify=1 , agent99.lastIdentify=2
agent007.badlastIdentify=1 , agent007.lastIdentify=2
Agent.badlastIdentify=0 Agent.lastIdentify=2
另请参阅:
Python名称空间是关于什么的
"最小惊奇";和可变默认自变量