我何时以及为什么要在新类init中为另一个类设置变量作为参数?

时间:2014-05-25 23:00:55

标签: python class arguments

class SchoolOfFish:
    def __init__(self, position, fish_class=Fish, number_of_fish=1):
        self.position = position
        self.timer = 0
        self.list_of_fish = []
        for i in range(number_of_fish):
            self.list_of_fish.append(fish_class(screen.size / 2))

class SchoolOfFish:
    def __init__(self, position, number_of_fish=1):
        self.position = position
        self.timer = 0
        self.list_of_fish = []
        for i in range(number_of_fish):
            self.list_of_fish.append(Fish(screen.size / 2))

这两个都做同样的事情,即使用前一个类“Fish”的实例填充SchoolOfFish.list_of_fish。如第一个例子中那样包含变量“fish_class”是否有优势? 另外,我一直无法找到有关在类 init 方法中将默认值设置为参数的Python文档。你能指点我解释一下它的运作方式吗?

2 个答案:

答案 0 :(得分:1)

除了硬编码SchoolOfFish之外,它允许您使用不同类型的Fish类。

在上面的示例中,默认值为Fish,但在调用构造函数时,可以在运行时指定另一个类。

编辑re:默认args:

关于__init__中的默认args,它在概念上与在任何其他方法/函数中为参数设置默认值没有任何不同。只需指定x=y,其中x是参数名称,y是其默认值。

答案 1 :(得分:1)

据推测,您可以初始化SchoolOfFish种不同类型的鱼。

如果未指定fish_class,则提供的构造函数都提供默认值,然后默认构建通用Fish列表。

但是,fish_class允许您指定某类鱼类。

例如,您可能希望初始化BaracudaSnapper的学校,这两个学校都是通用Fish课程的子类。

(实际上,代码中没有任何内容确保fish_class实际上是Fish类,您可以使用fish_class = Dog调用构造函数。