关于python中__init__的疑问

时间:2017-12-20 11:50:31

标签: python initialization arguments init

我最近通过某些在线课程学习python课程,所以我是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] ,我不确定何时需要输入 pos 等变量, vel 颜色进入 __ init __(自我) __ init __(self,pos,vel,color)

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

4 个答案:

答案 0 :(得分:1)

对于初学者来说,第一个例子并没有多大意义。 __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], yellow)等)。

在第二个示例中,您提供的调用代码无法控制用于初始化实例属性的值,因为它们在__init__的代码中是硬编码的,以及创建{的方法{1}}对象将为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参数的任意组合)调用。

答案 1 :(得分:0)

Version[1]代码进行小修改后会更清楚。

版本[1]

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

正如您现在所知,我们将参数传递给init function,该bubbleObj = Bubble(1, [0,0], "red") 用于指定类中每个成员的值。

因此创建了您的对象,例如:

>>> bubbleObj.pos
=>  1

#driver value:

Version[2]

然而,在您的bubbleObj = Bubble() 代码中,没有可能的参数化。所以在这种情况下,对象的创建方式如下:

parameterised constructor

这类似于default constructor&的C ++惯例。分别为{extensionID} : The ID of my WebExtension {url_to_update_manifest} : The url which delivers the update manifest XML file {value} : A value

如需进一步阅读,请查看Pydoc for Classes

答案 2 :(得分:0)

版本1

使用

初始化此类时
Bubble1 = Bubble(pos, vel, colour) # args are required here

init将成功,但不会使用您作为参数输入的pos,vel和color的值,因为您正在创建类变量self.pos, self.vel, self.color而不使用从参数接收的值。

如果您执行类变量初始化,如:

def __init__(self, pos, vel, colour):
    self.pos = pos
    self.vel = vel
    self.colour = colour

那么这将是init函数更正确的用法。您在版本1中执行的操作不是在创建类对象时使用您传递的参数。

第2版

似乎正确。您正在init方法中分配类变量self.pos, self.vel, self.color。假设您可以正确访问list(FIRING_POSITION)的值,则此函数将起作用。由于您不需要将任何参数分配给类变量,因此可以使用以下代码实例化该类:

Bubble2 = Bubble() #  no args in here

答案 3 :(得分:0)

如果您了解为特定问题设计类的基本思想,OOP的实现将更有用。我们举个例子:

class Person:

    def __init__(self, name, surname, birthdate,email):
        self.name = name
        self.surname = surname
        self.birthdate = birthdate
        self.email = email

此处Person是一个蓝图,表示您要创建的实例。并且,所有属性namesurnamebirthdateemail都特定于特定实例,并且基于这些属性,我们可以定义任何人的状态。而且,您可能需要计算Person的多个实例,并根据您的要求计算其他属性。

在你的情况下,

class Bubble:

    def __init__(self, pos, vel, colour):
        pass

虽然您正在传递pos, vel, colour,但您没有根据这些参数定义属性。这意味着,那些传递值不代表实际场景中的Bubble

如果您认为pos, vel, colour是定义state的{​​{1}}的属性/属性,那么您应该将您的类定义为:

class