【问题标题】:Python: referencing class object list of listsPython:引用列表的类对象列表
【发布时间】:2012-12-09 15:23:36
【问题描述】:

我对 python 还很陌生。我试图定义一个类,然后我想从一个文件创建一个实例,然后引用它的特定部分,但似乎不能。这是 Python 3.3.0

这是课程....

class Teams():

    def __init__(self, ID = None, Team = None, R = None, W = None, L = None):
        self._items = [ [] for i in range(5) ]
        self.Count = 0


    def addTeam(self, ID, Team, R=None, W = 0, L = 0):
        self._items[0].append(ID)
        self._items[1].append(Team)
        self._items[2].append(R)
        self._items[3].append(W)
        self._items[4].append(L)
        self.Count += 1

    def addTeamsFromFile(self, filename):
        inputFile = open(filename, 'r')
        for line in inputFile:
            words = line.split(',')
            self.addTeam(words[0], words[1], words[2], words[3], words[4])

    def __len__(self):
        return self.Count

这是 Main 中的代码

startFileName = 'file_test.txt'
filename = startFileName

###########
myTestData = Teams()

myTestData.addTeamsFromFile(startFileName)

文件中的样本数据

100,AAAA,106,5,0
200,BBBB,88,3,2
300,CCCC,45,1,4
400,DDDD,67,3,2
500,EEEE,90,4,1

我认为我在这里很好(不是 100% 肯定),但现在我如何参考这些数据来查看...我没有正确创建类吗?如何查看一个实例是否大于另一个实例...

myTestData[2][2] > myTestData[3][2]

【问题讨论】:

  • 使用后别忘了关闭文件句柄;或者使用 with open() as f: 语法让 Python 为你做这件事。

标签: python python-3.x member-access


【解决方案1】:

为什么不创建一个像这样的Team 类:

class Team():
    def __init__(self, ID, Team, R=None, W = 0, L = 0)
      # set up fields here

然后在Teams

class Teams():
   def __init__(self):
       self._teams = []
   def addTeam (self, ID, Team, R=None, W = 0, L = 0)
       team = Team (ID, Team, R=None, W = 0, L = 0)
       self._teams.append (team)

现在,如果我做对了,您想覆盖 > 操作员的行为。

要做到这一点,__gt__(self, other) [link]

原来如此

class Team ():
   # init code from above for Team

    def __gt__ (self, otherTeam):
        return self.ID > otherTeam.ID # for example

还要确保将这些字符串转换为数字,因为您比较的是字符串而不是数字。为此使用int 函数。

【讨论】:

    【解决方案2】:

    您遇到的直接问题是您访问团队数据的代码没有说明您的 myTestData 值是一个对象而不是一个列表。您可以通过以下方式修复它:

    myTestData._items[2][2] > myTestData._items[3][2]
    

    不过,如果您打算这样做,我建议将 _items 重命名为显然应该公开的名称。您可能还想让addTeamsFromFile 方法将它读取的一些值转换为整数(而不是将它们保留为字符串),然后再将它们传递给addTeam 方法。

    另一种方法是让您的Teams 类支持直接成员访问。您可以通过创建一个名为 __getitem__ 的方法来做到这一点(如果您希望能够直接分配值,则可以使用 __setitem__)。比如:

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

    @Aleksandar 关于为团队数据项创建一个类的答案也是一个很好的答案。事实上,为单个团队创建一个类可能比一个包含多个团队的类更有用。您可以将 Teams 类替换为 Team 实例列表。我猜这取决于你打算用它做什么。

    【讨论】:

    • 谢谢。我结合了这两个建议。首先是 aTeam() 类(名为“Team”的项目太多),然后是 Teams() 类……我可以从文件中添加。我添加了一个方法 getitem,但是如何从 main 调用它?我尝试的一切都说它是未定义的。
    • @user1889575:__getitem__ 方法会在您执行 obj[index] 时自动调用。也就是说,您的原始代码(如myTestData[2][2])应该可以工作。
    • 谢谢。我必须为这两个类创建__getitem__
    • 哦,我明白了。是的,如果您仍然将数据存储在 aTeam 类内的列表中,那么您也需要一个 __getitem__ 方法。但是,我建议改用属性。也就是说,将W 值放在self.W 中,而不是放在列表中的某个索引中。然后你会做myTestData[2].W(或其他)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2014-11-19
    • 2016-11-21
    相关资源
    最近更新 更多