调用了来自不同父级 class 的方法(同名),但结果显示代码仅运行其中一个

Called methods (with the same name) from different parent class, but results appear code only runs one of them

我做了三种骰子,然后用杯子包起来。 Cup 继承了两个 classes(它们继承了相同的基数 class)。在 cup 中,我从两个父 classes 和基础 class.

调用了三个 roll 方法

当我运行 cup.roll时,我应该得到三个数字,第一个应该运行从1-6,第二个1-10,第三个1-20。但是我运行很多次,结果都显示了1-10的三个数字运行ge,也就是说只有roll方法只派生自父class中的一个。

为什么会这样?以及如何解决这个问题?我刚从 Python.

开始

更新

上面的问题通过更改Cup的结构解决了,但是我又遇到了新的问题。

现在,代码工作正常,直到我输出结果的最后一部分,三个骰子应该返回三个列表,但最后两个是空的,其中,当 roll 和 sum 时,它们不是空的.很奇怪。

输出:

# >>> c = cup(2,3,4)
# 2 3 4
# >>> c.roll()
# (when print out roll in dices)
# [5, 2]
# [2, 6, 2]
# [6, 6, 2, 5]
# (but, when print out roll in cup, two become empty)
# [5, 2] [] []
# 36

代码:

class SixSidedDie:
    sides = 6
    valueLst = []
    sumVal = int()

    def __init__(self, nOfDie):
        self.nOfDie = nOfDie

    def roll(self):
        import random
        self.valueLst = []
        for i in range(1, self.nOfDie+1):
            self.valueLst.append(random.randint(1,self.sides))
        print(self.valueLst)
        return self.valueLst

    def sum(self):
        self.sumVal = 0
        for i in self.valueLst:
            self.sumVal += i
        return self.sumVal

    def getFaceValue(self):
        return self.valueLst

    def __repr__(self):
        return 'SixSidedDie({})'.format(self.faceValue)



class TenSidedDie(SixSidedDie):
    sides = 10          
    def __repr__(self):
        return 'TenSidedDie({})'.format(self.faceValue) 



class TwentySidedDie(SixSidedDie):

    sides = 20
    def __repr__(self):
        return 'TwentySidedDie({})'.format(self.faceValue) 





class cup():   

    sixSDLst = []
    tenSDLst = []
    twentySDLst = []

    def __init__(self, nOfSixSdDie = 1, nOfTenSdDie = 1, nOfTwentySdDie = 1):
        self.sixSdDie = SixSidedDie(nOfSixSdDie)
        self.tenSdDie = TenSidedDie(nOfTenSdDie)
        self.twentySdDie = TwentySidedDie(nOfTwentySdDie)
        print(nOfSixSdDie, nOfTenSdDie, nOfTwentySdDie)

    def roll(self):
        self.sixSDLst = self.sixSdDie.roll()
        self.tenSDlst = self.tenSdDie.roll()
        self.twentySDlst= self.twentySdDie.roll()
        print(self.sixSDLst,self.tenSDLst,self.twentySDLst)
        return self.sixSdDie.sum() + self.tenSdDie.sum() + self.twentySdDie.sum()

    def getSum(self):
        return self.sixSdDie.sum()+ self.tenSdDie.sum() + self.twentySdDie.sum()

    def __repr__(self):
        output = ''
        for i in self.sixSDLst:
            output = output + 'SixSidedDie(' + str(i) +'),'

        for j in self.tenSDLst:
            output = output + 'TenSidedDie(' + str(i) +'),'

        for k in self.twentySDLst[:-1]:
            output = output + 'TwentySidedDie(' + str(i) +'),'
        output = 'Cup(' + output + 'TwentySidedDie(' + str(self.twentySDLst[-1]) +')' + ')'
        return output

它正在发生,因为边是从 TenSidedDie 继承的,然后您将其作为自身传递给每个卷。在 cup 定义的开头添加 print(self.sides) 以查看其实际效果。 来自 python class docs:

class DerivedClassName(Base1, Base2, Base3):
   <statement-1>
    .
    .
    .
   <statement-N>

For most purposes, in the simplest cases, you can think of the search for attributes inherited from a parent class as depth-first, left-to-right, not searching twice in the same class where there is an overlap in the hierarchy. Thus, if an attribute is not found in DerivedClassName, it is searched for in Base1, then (recursively) in the base classes of Base1, and if it was not found there, it was searched for in Base2, and so on.

去掉继承后可以这样解决:

 six_die =  SixSidedDie()
 for i in range(1, self.nOfSixSdDie+1):            
     self.fVOfSixSdDie.append(six_die.roll())  

首先,正如其他人所说,您错误地使用了继承,但我认为这是作业要求。

在您的 Dice 子类中尝试更新 __init__ 方法中的边数:

class TenSidedDie(SixSidedDie):
    def __init__(self):
        self.sides = 10

    def __repr__(self):
       return 'TenSidedDie({})'.format(self.faceValue) 

此外,调用 roll 时不需要包含 self。

for k in range(1, self.nOfTwentySdDie+1):
            self.fVOfTwentySdDie.append(TwentySidedDie.roll())

使用更新后的代码:

注释掉全局初始化列表对我有用。

附带说明一下,在打印信息时,您希望能够查看日志并立即理解它。我建议在 roll roll 方法中添加以下行: print('Rolling [{}], count: [{}] values: {}'.format(self.sides, self.nOfDie, self.valueLst)) 这将告诉您要掷的骰子的大小、数量以及每个骰子的结果。不再解析日志。


由于您只是遇到技术问题而不是要求为您完成作业,因此这是我拥有的适合我的代码。我做了一些小的重写以使其更易于管理并添加了日志记录:

import random

class SixSidedDie:
    sides = 6
    valueLst = []
    sumVal = int()

    def __init__(self, nOfDie):
        print('intializing d6 with [{}] dice'.format(nOfDie))
        self.nOfDie = nOfDie

    def roll(self):
        self.valueLst = []
        for i in range(1, self.nOfDie+1):
            self.valueLst.append(random.randint(1,self.sides))
        print('Rolling {} d{} values: {}'.format(self.nOfDie, self.sides, self.valueLst))
        return self.valueLst

    def sum(self):
        self.sumVal = 0
        for i in self.valueLst:
            self.sumVal += i
        return self.sumVal

    def getFaceValue(self):
        return self.valueLst

    def __repr__(self):
        return 'SixSidedDie({})'.format(self.faceValue)

class TenSidedDie(SixSidedDie):
    def __init__(self, nOfDie):
        print('intializing d10 with [{}] dice'.format(nOfDie))
        self.nOfDie = nOfDie
        self.sides = 10

    def __repr__(self):
        return 'TenSidedDie({})'.format(self.faceValue) 

class TwentySidedDie(SixSidedDie):
    def __init__(self, nOfDie):
        print('intializing d20 with [{}] dice'.format(nOfDie))
        self.nOfDie = nOfDie
        self.sides = 20

    def __repr__(self):
        return 'TwentySidedDie({})'.format(self.faceValue) 


class cup():

    def __init__(self, nOfSixSdDie = 1, nOfTenSdDie = 1, nOfTwentySdDie = 1):
        self.sixSdDie = SixSidedDie(nOfSixSdDie)
        self.tenSdDie = TenSidedDie(nOfTenSdDie)
        self.twentySdDie = TwentySidedDie(nOfTwentySdDie)

    def getSum(self):
        return self.sixSdDie.sum()+ self.tenSdDie.sum() + self.twentySdDie.sum()

    def roll(self):
        self.sixSdLst = self.sixSdDie.roll()
        self.tenSdLst = self.tenSdDie.roll()
        self.twentySdLst = self.twentySdDie.roll()
        return self.getSum()

    def __repr__(self):
        output = ''
        print('6 sided : [{}]\n10 sided: [{}]\n20 sided: [{}]'.format(len(self.sixSdLst), len(self.tenSdLst), len(self.twentySdLst)))
        for i in self.sixSdLst:
            output += 'SixSidedDie(' + str(i) +'),'
        output += '\n'

        for j in self.tenSdLst:
            output += 'TenSidedDie(' + str(j) +'),'
        output += '\n'

        for k in self.twentySdLst:
            output += 'TwentySidedDie(' + str(k) +'),'
        result = 'Cup(' + output + ')'
        return result


play_cup = cup(20, 20, 20)

print('ROLL:', play_cup.roll())
print('SUM:', play_cup.getSum())
print(play_cup)

结果:

intializing d6 with [5] dice
intializing d10 with [5] dice
intializing d20 with [5] dice
Rolling 5 d6 values: [1, 2, 2, 2, 3]
Rolling 5 d10 values: [6, 4, 5, 7, 3]
Rolling 5 d20 values: [9, 8, 2, 5, 10]
ROLL: 69
6 sided : [5]
10 sided: [5]
20 sided: [5]
[1, 2, 2, 2, 3]
[6, 4, 5, 7, 3]
[9, 8, 2, 5, 10]
Cup(SixSidedDie(1),SixSidedDie(2),SixSidedDie(2),SixSidedDie(2),SixSidedDie(3),
TenSidedDie(6),TenSidedDie(4),TenSidedDie(5),TenSidedDie(7),TenSidedDie(3),
TwentySidedDie(9),TwentySidedDie(8),TwentySidedDie(2),TwentySidedDie(5),TwentySidedDie(10),)