我是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
感谢。
答案 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
。在初始化器中初始化name
和age
时,您还可以假设两个属性都存在:
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)
实际上,请求**kwargs
和name
作为初始化中的正确参数,而不是仅仅接受age
。由于您确实需要指定name
和age
,因此错误地调用构造函数会以这种方式提前失败:
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))