概述
这条线的原因是year_choice = [i for i in range(100) if i > max_year]
在Python2中可以工作,但在Python3中不行,列表理解会创建一个新的作用域,max_yearclass属性不在该范围内。在Python2中,列表理解不会创建新的作用域,而是在周围代码的上下文中运行。这最初是出于性能的考虑,但是很多人发现这很混乱,所以在python3中进行了更改,使列表理解与生成器表达式以及set和dict理解保持一致。在
在python3中,没有一种简单的方法可以访问在类的外部上下文中运行的列表理解内部的class属性,而不是在方法内部。不能用Student.max_year引用它,因为此时Student类不存在。在
然而,无论如何,在那里理解列表是没有意义的。您可以更紧凑、更高效地创建所需的列表。例如:
^{pr2}$
输出[19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
该代码在python2和python3上生成相同的输出。在
我已将类签名改为class Student(object):
因此它在Python2中创建了一个新样式的类(在Python3中,所有类都是新样式的)。在
[i for i in range(max_year)]可以绕过这个限制的原因是从range(max_year)创建一个迭代器,然后将其作为参数传递给运行列表理解的临时函数。所以它相当于这个代码:class Student(object):
max_year = 18
def _listcomp(iterator):
result = []
for i in iterator:
result.append(i)
return result
year_choice = _listcomp(iter(range(max_year + 1, 100)))
del _listcomp
def __init__(self, name):
self.name = name
print(self.year_choice)
Student('Blah')
非常感谢安蒂·哈帕拉的解释。在
最后
以上就是活泼毛豆为你收集整理的python3 类 变量定义 __未定义Python 3类变量的全部内容,希望文章能够帮你解决python3 类 变量定义 __未定义Python 3类变量所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复