一个局部变量,也是一个类变量

时间:2017-10-31 16:02:23

标签: python

我很困惑为什么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.

3 个答案:

答案 0 :(得分:1)

分配始终创建一个局部变量; globalnonlocal语句的目的是覆盖该行为。但是,您仍然需要通过类访问类变量,因为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