我很困惑为什么Python会抛出以下错误,尽管我的简单类首先声明了类变量,然后每次实例化一个新对象时递增其值:
for /R C:\QA\ %f in (*.log) do copy %f C:\QA\LOG\
有人可以帮我理解我在这里做错了吗?当然我应该在修改之前创建我的局部变量(在本例中是一个类变量),为什么这是一个问题呢?
r = Robot("Rob")
population += 1
UnboundLocalError: local variable 'population' referenced before assignment.
答案 0 :(得分:1)
分配始终创建一个局部变量; global
和nonlocal
语句的目的是覆盖该行为。但是,您仍然需要通过类访问类变量,因为class
语句不会创建nonlocal
可以引用的新范围。
def __init__(self, name):
self.name = name
Robot.population += 1
print("Initializing {}".format(self.name) )
答案 1 :(得分:1)
试试这个:
class Robot:
''' Represents a robot with a name! '''
# A class variable.
# Increments every time
# an object of this class
# is instantiated, so it
# counts the instances.
#
population = 0
def __init__(self, name):
self.name = name
Robot.population += 1
print("Initializing {}".format(self.name) )
print(Robot.population)
r = Robot("Rob")
print(Robot.population)
r = Robot("Rob")
print(Robot.population)
执行输出:
0
Initializing Rob
1
Initializing Rob
2
答案 2 :(得分:1)
正如其他人已经指出的那样,您需要显式引用名为population
的类属性。虽然这可以通过将类名Robot
硬编码到增量语句中来完成,但可以通过引用self
参数的类来避免这种情况。
这意味着该方法中的代码不再依赖于确切的类名称,如果由于某种原因该名称曾被更改,则不必进行调整。
class Robot:
population = 0
def __init__(self, name):
self.name = name
self.__class__.population += 1 # Class name *not* hardcoded.
print("Initializing {}".format(self.name) )
print('Robot.population:', Robot.population) # -> Robot.population: 0
rob = Robot("Rob") # -> Initializing Rob
josh = Robot("Josh") # -> Initializing Josh
print('Robot.population:', Robot.population) # -> Robot.population: 2