如何从类定义中的列表推导中访问其他类变量?以下适用于Python 2但在Python 3中失败:
class Foo:
x = 5
y = [x for i in range(1)]
Run Code Online (Sandbox Code Playgroud)
Python 3.2给出了错误:
NameError: global name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)
尝试Foo.x也不起作用.有关如何在Python 3中执行此操作的任何想法?
一个稍微复杂的激励示例:
from collections import namedtuple
class StateDatabase:
State = namedtuple('State', ['name', 'capital'])
db = [State(*args) for args in [
['Alabama', 'Montgomery'],
['Alaska', 'Juneau'],
# ...
]]
Run Code Online (Sandbox Code Playgroud)
在这个例子中,apply()本来是一个不错的解决方法,但它遗憾地从Python 3中删除.
本child类从继承parent类.child我在构造函数内部 通过重复调用中定义的成员函数初始化一个list-type成员变量.事实证明,如果我通过显式循环并附加返回的每个值进行初始化,一切正常.xsfoo()parentxsfoo()
但是,如果我尝试在列表理解中做同样的事情,我会收到一个奇怪的错误.为什么会出现此错误?在这种情况下,列表理解和显式循环之间有什么区别?
有效的代码的MWE:
class parent(object):
def __init__(self):
self.x = 5
def foo(self, a):
return self.x
class child(parent):
def __init__(self):
super().__init__()
self.xs = []
for i in range(9):
self.xs.append(super().foo(i))
mychild = child()
Run Code Online (Sandbox Code Playgroud)
child列表理解的定义:
class child(parent):
def __init__(self):
super().__init__()
self.xs = [super().foo(i) for i in range(9)]
Run Code Online (Sandbox Code Playgroud)
有问题的错误:
% python test.py
Traceback (most recent call last):
File "test.py", line 20, in <module>
mychild = child()
File "test.py", line …Run Code Online (Sandbox Code Playgroud) 看看下面这段代码:
class a:
s = 'python'
b = ['p', 'y']
c = [x for x in s]
Run Code Online (Sandbox Code Playgroud)
输出:
>>> a.c
['p', 'y', 't', 'h', 'o', 'n']
Run Code Online (Sandbox Code Playgroud)
但当我试图限制列表时,如果:
class a:
s = 'python'
b = ['p', 'y']
c = [x for x in s if x in b]
Run Code Online (Sandbox Code Playgroud)
显示以下异常:
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
class a:
File "<pyshell#22>", line 4, in a
c = [x for x in s if x in b]
File "<pyshell#22>", …Run Code Online (Sandbox Code Playgroud)