Python OOP和定义方法是类

时间:2019-03-18 08:57:52

标签: python class oop

我现在正在学习Python OOP,并与下面的代码混淆:

class Player:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"{self.name}"

class Team:
    def __init__(self, name, players=None):
        self.name = name
        if players is not None:
            self._players = list(players)
        else:
            self._players = []

    def add_player(self, obj):
        self._players.append(obj)

    def __iter__(self):
        return iter(self._players)

    def __str__(self):
        out = [f"Team: {self.name}", "Players:"]
        out.extend(str(player) for player in self)
        return "\n".join(out)

if __name__ == "__main__":
    players = [Player("Afrasiab"),
               Player("Babak"),
               Player("Garshasp"),
               Player("Jamshid"),
               Player("Keyumars"),
               Player("Katayoun"),
               Player("Roham"),
               Player("Tahmoores")]

    iran = Team("Iran", players)
    print(iran)

    # equivalent:
    print("Team:", iran.name)
    print("Players:")
    for player in iran:
        print(player)

我想知道:

为什么在代码的第12行中 players 之前有下划线?

self._players = list(players)

简而言之,您能解释一下这段代码的工作原理吗?

1 个答案:

答案 0 :(得分:0)

  

为什么在团队 init 团队中的玩家之前有下划线

Python中的__init__方法是大多数其他OOP语言中的 Constructor 。 这是在实例化类的对象时调用的方法。 这意味着当您调用Player(“ NameOfPlayer”)时,将调用init方法。

  

为什么我们应该检查玩家是否不是无人

如果您将None交给玩家列表list(None),则会导致TypeError。

  

为什么我们要在列表中的玩家之前放置列表

这真是个奇怪的代码,您应该在此处检查类型是Player还是Player的列表,否则抛出错误。

除了@Lomtrur的注释之外,self._players变量的下划线表示_players是私有变量。