如何获得类(\uu init\uu)的输入参数的数量?

bwleehnv  于 2021-07-13  发布在  Java
关注(0)|答案(4)|浏览(188)

我想用python生成类分数,它获取每个主题的分数并返回其平均值和总和。我知道如果我接收到4个参数,那么平均分母应该是4,但是我如何才能使它成为由输入数改变的固定代码呢?而不仅仅是计数和键入4。我尝试使用len(self)或for循环来计数,但是len会出错,for循环并不是那么容易。

class score:
    def __init__(self, language, math, english, science):
        self.language = language
        self.math = math
        self.english = english
        self.science = science

    ...

    def sum_scores(self):
        result = self.language + self.math + self.english + self.science
        return result

    def average(self):
        average = self.sum_scores()/4 # Here is the problem!
        return average

这是我的第一个问题。很抱歉,我的英语很差,还有一些愚蠢的问题。

rur96b6h

rur96b6h1#

可以在init函数中使用关键字参数:

class Score:
     def __init__(self,**scores):
         self.classes = []
         for _class, score in scores.items():
             setattr(self, _class, score) # self.english, self.math, etc.
             self.classes.append(_class) # ["math", "english"]
     def sum_scores(self):
         sum = 0
         for i in self.classes:
              sum += getattr(self, i)
         return sum
     def average(self):
         return self.sum_scores() / len(self.classes)

通过使用**分数,您可以动态地迭代作为字典传递到函数中的所有参数。这里,我用 setattr 函数为score对象提供其类名的属性,其值是字典中相应的值。这样,我就可以动态地迭代每个类,不管提供3个或100个类作为输入。

score1 = Score(math=67, english=98, art=76)

print(score1.sum_scores())
print(score1.average())
>>> 241
>>> 80.3333333333
bpsygsoo

bpsygsoo2#

首先不要使用4个单独的属性。使用 dict 存储属性;然后可以查询 dict .

class score:
    def __init__(self, language, math, english, science):
        self.scores = {'language': language, 'math': math, 'english': english, 'science': science}

    ...

    def sum_scores(self):
        return sum(self.scores.values())

    def average(self):
        return self.sum_scores() / len(self.scores)

如果仍然需要每个分数的属性,请使用属性:

class score:
    def __init__(self, language, math, english, science):
        self.scores = {'language': language, 'math': math, 'english': english, 'science': science}

    @property
    def language(self):
        return self.scores['language']

    # etc.

    def sum_scores(self):
        return sum(self.scores.values())

    def average(self):
        return self.sum_scores() / len(self.scores)
whitzsjs

whitzsjs3#

假设您不知道分数适用的主题是可以的,那么您可以只使用未命名的位置参数

class score:
    def __init__(self, *args):
        self.scores = args

    ...

    def sum_scores(self):
        return sum(self.scores)

    def average(self):
        return self.sum_scores() / len(self.scores)
vh0rcniy

vh0rcniy4#

对于你的情况,你可以注意到数量是4
但是,您可能需要使用 **kwargs 作为一个参数(你可以用任何名字,这只是惯例; ** 将所有未明确命名的关键字参数指定给dict)

SUBJECTS = ("math", "science" ... )

class MyClass():
    def __init__(self,**kwargs):  # also consider *args
        self.subjects = {k: v for k, v in kwargs.items() if k in SUBJECTS}

    def sum_scores(self):
        return sum(self.subjects.values())

    def average(self):
        return self.sum_scores() / len(self.subjects)
>>> c = MyClass(math=10, science=8)
>>> c.sum_scores()
18
>>> c.average()
9.0

您还可以考虑报告不用于帮助用户查找使用错误的参数

相关问题