Python嵌套类 - 返回多个值

时间:2013-08-22 02:08:24

标签: python

我对python中的类很新,所以请保持温和。我的脚本比这更复杂,但这基本上归结为:

class primary_state:
    def __init__(self,x,y,z):
        self.x = x
        self.y = y
        self.z = z
        self.substates=[]

    def add_substate(self,i,j,k):
        self.substates.append(self.substate(i,j,k))

    class substate:
        def __init__(self,i,j,k):
            self.i = i
            self.j = j
            self.k = k

state = primary_state(1,2,3)
state.add_substate(4,5,6)
state.add_substate(7,8,9)

现在我的问题是:是否可以从每个对象返回一个值数组?例如,我想做:

state.substates[:].i

并让它返回值4和7,但是alas子类是一个列表,所以它无法处理它。还必须有一种更有效的方法来做到这一点,但我还没有想到这一点。任何建议/想法将不胜感激!感谢。

3 个答案:

答案 0 :(得分:4)

使用list comprehension

[sub.i for sub in state.substates]

这大致等同于以下内容:

x = []
for sub in state.substates:
    x.append(sub.i)

除了更短,它是一个表达式,你可以嵌入其他表达式而不是一系列语句。

答案 1 :(得分:0)

您可以通过调用以下方式获取子状态列表:

[substate.i for substate in self.substates]

答案 2 :(得分:0)

列表理解是这样做的方式,正如其他答案所指出的那样。

如果主要状态类的唯一作业是保存子类,则可以使类的行为类似于可迭代。在这个例子中,你给出的主要是语法糖,但它可能很有用。有关如何操作的完整说明是here,但它非常简单:

class PrimaryState(object):  #always use "new style" classes! its 2013!
    def __init__(self,x,y,z):
        self.x = x
        self.y = y
        self.z = z
        self.substates=[]

    def __len__(self):
       return len(self.substates)

    def __getitem__(self, index):
       return self.substates[index]

    def __iter__(self):
       for sub in substates: yield sub

    def __contains__(self, item):
        return item in self.substates

        def add(self, item): 
            self.substates.append(item)

这样你就可以:

 primary = PrimaryState(1,2,3)
 primary.add(SubState(4,5,6))
 primary.add(SubState(7,8,9))

 for item in primary:
     print item

 # Substate 4,5,6
 # Substate 7,8,9

PS:查看PEP-8,命名类的标准python样式指南,依此类推。并使用新的样式类(继承自object)。在路上它很重要!