从方法中访问python类变量

时间:2014-04-08 20:47:28

标签: python

我是Python新手,我正在尝试弄清楚如何在下面的Student类中的repr方法中访问全局变量计数:

class Student(object):
    count = 0
    def __init__(self, **kwargs):
        self.name = kwargs.get("name")
        self.age = kwargs.get("age")
        Student.count += 1
    def __repr__(self):
        try:
            return "name: %s, age: %d" % (self.name, self.age)
        except TypeError:
            print "student number: %d" % (Student.count)

当我创建一个实例,例如student = Student,并尝试打印变量学生时,我收到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "school.py", line 23, in __repr__
    print "student number: %d" % (Student.count)
NameError: global name 'count' is not defined

感谢。

2 个答案:

答案 0 :(得分:0)

您应该在课程中使用self.count而不是Student.count。您不需要使用Student.count,因为您仍然在课堂内,self指的是课堂内的任何内容。它不需要在__init__函数内。例如:

class RandomClass:
    random_var = 0
    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2
    another_var = 3
    def __str__(self):
        print(“Printing variables: %d and %d” % (self.random_var, self.another_var))#using self.random_var, not RandomClass.random_var

答案 1 :(得分:0)

您也可以使用self访问类属性。在您的情况下,__repr__中的错误处理不是必需的。在一种方法中,self总是正确的(除非你真的搞砸了),所以你可以假设你可以正确地访问self。在初始化器中初始化nameage时,您还可以假设两个属性都存在:

class Student (object):
    count = 0
    def __init__ (self, **kwargs):
        self.name = kwargs['name']
        self.age = kwargs['age']
        self.count += 1

    def __repr__ (self):
        return "name: %s, age: %d" % (self.name, self.age)

实际上,请求**kwargsname作为初始化中的正确参数,而不是仅仅接受age。由于您确实需要指定nameage,因此错误地调用构造函数会以这种方式提前失败:

def __init__ (self, name, age, **kwargs): # **kwargs in case you want to accept more
    self.name = name
    self.age = age
    self.count += 1

所有人都说,你所展示的错误不应该发生。不应该在__repr__中抛出异常,并且Student.count也应该是可访问的。所以你可能会以某种奇怪的方式调用__repr__。正确的方法是这样的:

a = Student(name='Peter', age=15)
print(repr(a))