基本Python继承问题

2024-10-16 17:18:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我设置了以下两个类:

class Player:

    POINTS_PER_PASSING_YARD = 0.04
    POINTS_PER_PASSING_TOUCHDOWN = 4
    POINTS_PER_INTERCEPTION = -1
    POINTS_PER_RUSHING_YARD = 0.1
    POINTS_PER_RUSHING_TOUCHDOWN = 6
    POINTS_PER_RUSHING_FUMBLE = -2
    POINTS_PER_RECEPTION_YARD = 0.1
    POINTS_PER_RECEPTION_TOUCHDOWN = 6

def __init__(self, name, team, rushingYards, rushingTouchdowns, rushingFumbles):
    self.name = name
    self.team = team
    self.rushingYards = rushingYards
    self.rushingTouchdowns = rushingTouchdowns
    self.rushingFumbles= rushingFumbles

def calculatePoints(self):
    return self.rushingYards * POINTS_PER_RUSHING_YARD + self.rushingTouchdowns * POINTS_PER_RUSHING_TOUCHDOWN + self.rushingFumbles * POINTS_PER_RUSHING_FUMBLE

def toString(self):
    return "name: " + self.name + " team: " + self.team + " passing yards: " + self.passingYards + " rushing yards: " + self.rushingYards + " touchdowns: " + self.touchdowns + " interceptions: " +     self.interceptions

然后我有一个从Player继承的QB类:

从播放器导入*

class QB(Player):
    def __init__(self, name, team, rushingYards, rushingTouchdowns, rushingFumbles, passingYards, passingTouchdowns, interceptions, position="QB"):
        super().__init__(self, name, team, rushingYards, rushingTouchdowns, rushingFumbles)
        self.passingYards = passingYards
        self.passingTouchdowns = passingTouchdowns
        self.interceptions = interceptions

    def toString(self):
        return "position: " + self.position + super().toString()

然后在我的主课上,我只做:

myQB = QB("Brees", "Saints", 0, 0, 0, 4952, 33, 17)
print(myQB)

我得到以下错误:

Traceback (most recent call last):
  File "main.py", line 35, in <module>
    main()
  File "main.py", line 32, in main
    myQB = QB("Brees", "Saints", 0, 0, 0, 4952, 33, 17)
  File "/Users/benjaminclayman/Desktop/Aurora_Fantasy_Football/QB.py", line 5, in __init__
    Player.__init__(self, name, team, rushingYards, rushingTouchdowns, rushingFumbles)
TypeError: object.__init__() takes no parameters

但我不知道为什么,因为我写的所有init方法都接受参数。。。你知道吗

知道怎么回事吗?你知道吗

谢谢你, B外行


Tags: nameselfinitdefteampointsplayerper
3条回答

在Python中,缩进起主要作用。 问题清单: 1) __init__()应该在Player类中。否则初始化将无法工作。你知道吗

2)其他函数def calculatePoints(self)也应该在class Player中。当前在代码中,它是在类之外定义的。你知道吗

3)def toString(self)也应该在class Player之内。你知道吗

3.1) Also the concatenation of string and int is not permitted. 
3.2) The variable `self.touchdowns` is not initialized in the def toString of class Player.
3.3) The alternate way to print the class with significant information 
     about class can be written in this manner.

class Player:
    POINTS_PER_PASSING_YARD = 0.04
    POINTS_PER_PASSING_TOUCHDOWN = 4
    POINTS_PER_INTERCEPTION = -1
    POINTS_PER_RUSHING_YARD = 0.1
    POINTS_PER_RUSHING_TOUCHDOWN = 6
    POINTS_PER_RUSHING_FUMBLE = -2
    POINTS_PER_RECEPTION_YARD = 0.1
    POINTS_PER_RECEPTION_TOUCHDOWN = 6

    def __init__(self, name, team, rushingYards, rushingTouchdowns, rushingFumbles):
        self.name = name
        self.team = team
        self.rushingYards = rushingYards
        self.rushingTouchdowns = rushingTouchdowns
        self.rushingFumbles= rushingFumbles

    def calculatePoints(self):
        return self.rushingYards * POINTS_PER_RUSHING_YARD + self.rushingTouchdowns * POINTS_PER_RUSHING_TOUCHDOWN + self.rushingFumbles * POINTS_PER_RUSHING_FUMBLE

    def __str__(self):
        return "name: %s team: %s passing yards: %r rushing yards: %r rushingTouchdowns: %r interceptions: %r"  % (self.name, self.team, self.passingYards, self.rushingYards, self.rushingTouchdowns ,self.interceptions)

4)self.position = position需要在class QB中初始化,如下所示:

class QB(Player):
    def __init__(self, name, team, rushingYards, rushingTouchdowns, rushingFumbles, passingYards, passingTouchdowns, interceptions, position="QB"):
        super().__init__(name, team, rushingYards, rushingTouchdowns, rushingFumbles)
        self.passingYards = passingYards
        self.passingTouchdowns = passingTouchdowns
        self.interceptions = interceptions
        self.position = position

    def __str__(self):
        return "position: " + self.position + super().__str__()

如果第一个脚本中的缩进(使用Player类)是正确的,那么这就是问题所在。你知道吗

根据您的缩进,__init__()方法和其他方法在类Player之外,因此Player使用object__init__(),它不接受任何参数(除了self,尽管我们不需要显式传递它)。你知道吗

您可能希望修复缩进,以便所有实例方法(您希望位于Player类中)都位于Player类中。你知道吗

示例-

class Player:

    POINTS_PER_PASSING_YARD = 0.04
    POINTS_PER_PASSING_TOUCHDOWN = 4
    POINTS_PER_INTERCEPTION = -1
    POINTS_PER_RUSHING_YARD = 0.1
    POINTS_PER_RUSHING_TOUCHDOWN = 6
    POINTS_PER_RUSHING_FUMBLE = -2
    POINTS_PER_RECEPTION_YARD = 0.1
    POINTS_PER_RECEPTION_TOUCHDOWN = 6

    def __init__(self, name, team, rushingYards, rushingTouchdowns, rushingFumbles):
        self.name = name
        self.team = team
        self.rushingYards = rushingYards
        self.rushingTouchdowns = rushingTouchdowns
        self.rushingFumbles= rushingFumbles

您将需要对所有希望位于Player类中的方法执行此操作。你知道吗


还有一个问题,您不应该将self传递给使用super()调用的te__init__()方法。你知道吗

示例-

class QB(Player):
    def __init__(self, name, team, rushingYards, rushingTouchdowns, rushingFumbles, passingYards, passingTouchdowns, interceptions, position="QB"):
        super().__init__(name, team, rushingYards, rushingTouchdowns, rushingFumbles)

一些问题,首先你需要修复你的压痕。你知道吗

第二,你应该改变

 this class Player:

 class Player(object):

另一个问题是,当您调用静态成员时,这是处理它们的方法:

Player.POINTS_PER_RUSHING_YARD  # name of the class and then the static member.

这就是你的上司的样子:

super(QB, self).__init__(name, team, rushingYards, rushingTouchdowns, rushingFumbles)

代码如下:

    class Player(object):
    POINTS_PER_PASSING_YARD = 0.04
    POINTS_PER_PASSING_TOUCHDOWN = 4
    POINTS_PER_INTERCEPTION = -1
    POINTS_PER_RUSHING_YARD = 0.1
    POINTS_PER_RUSHING_TOUCHDOWN = 6
    POINTS_PER_RUSHING_FUMBLE = -2
    POINTS_PER_RECEPTION_YARD = 0.1
    POINTS_PER_RECEPTION_TOUCHDOWN = 6
    def __init__(self, name, team, rushingYards, rushingTouchdowns, rushingFumbles):
        self.name = name
        self.team = team
        self.rushingYards = rushingYards
        self.rushingTouchdowns = rushingTouchdowns
        self.rushingFumbles= rushingFumbles
    def calculatePoints(self):
        return self.rushingYards * Player.POINTS_PER_RUSHING_YARD + self.rushingTouchdowns * Player.POINTS_PER_RUSHING_TOUCHDOWN + self.rushingFumbles * Player.POINTS_PER_RUSHING_FUMBLE
    def toString(self):
        return "name: " + self.name + " team: " + self.team + " passing yards: " + self.passingYards + " rushing yards: " + self.rushingYards + " touchdowns: " + self.touchdowns + " interceptions: " +     self.interceptions


class QB(Player):
    def __init__(self, name, team, rushingYards, rushingTouchdowns, rushingFumbles, passingYards, passingTouchdowns, interceptions, position="QB"):
        super(QB, self).__init__(name, team, rushingYards, rushingTouchdowns, rushingFumbles)
        self.passingYards = passingYards
        self.passingTouchdowns = passingTouchdowns
        self.interceptions = interceptions

    def toString(self):
       return "position: " + self.position + super(Player).toString()


myQB = QB("Brees", "Saints", 0, 0, 0, 4952, 33, 17)
print(myQB)

相关问题 更多 >