gpt4 book ai didi

python - 关于python中__init__的疑问

转载 作者:太空宇宙 更新时间:2023-11-03 11:42:10 24 4
gpt4 key购买 nike

我最近通过某些在线类(class)学习了 Python 类(class),所以我完全是 Python 的新手。

版本 [1]

class Bubble:

def __init__(self, pos, vel, colour):
self.pos = list(FIRING_POSITION)
self.vel = [0, 0]
self.color = random.choice(COLOR_LIST)

版本 [2]

class Bubble:

def __init__(self):
self.pos = list(FIRING_POSITION)
self.vel = [0, 0]
self.color = random.choice(COLOR_LIST)

我的疑问是:

(1)比较版本[1]版本[2],我不确定什么时候需要放置变量,例如posvelcolor 进入 __init__(self) 作为 __init__(self, pos, vel, colour)

(2)这两个版本有什么区别?

最佳答案

对于初学者来说,第一个例子没有多大意义。 __init__ 接受参数但不对它们做任何事情,实例属性的值仍然是硬编码的。

一个更合理的例子是:

class Bubble:
def __init__(self, pos, vel, color):
self.pos = pos
self.vel = vel
self.color = color

现在可以将它与您提供的第二个示例进行比较。

在上面的示例中,Bubble 将接受 3 个参数并将它们分配给实例属性。没有任何内容是硬编码的,调用代码可以控制创建实例的属性 (Bubble(position_1, [1, 2], blue)Bubble(position_2, [3, 3],黄色) 等)。

在第二个示例中,您提供的调用代码对用于初始化实例属性的值的控制为零,因为它们是硬编码在 __init__ 的代码中,以及创建 Bubble 对象将是 Bubble()

一种常见的方法是通过使用具有默认值的参数来适应这两种用例(请注意不要使用可变的默认参数):

class Bubble:
def __init__(self, pos=None, vel=None, color=None):
if pos is None:
self.pos = list(FIRING_POSITION)
else:
self.pos = pos
if vel is None:
self.vel = [0, 0]
else:
self.vel = vel
if color is None:
self.color = random.choice(COLOR_LIST)
else:
self.color = color

这可以更简洁地写成

class Bubble:
def __init__(self, pos=None, vel=None, color=None):
self.pos = pos or list(FIRING_POSITION)
self.vel = vel or [0, 0]
self.color = color or random.choice(COLOR_LIST)

这种方式提供了精细的控制,并且可以使用任意参数组合(0、1 或 2 和 3 个参数的任意组合)调用 Bubble

关于python - 关于python中__init__的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47905426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com