我最近通过某些在线课程学习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) 这两个版本有什么区别?
答案 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)
使用
初始化此类时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中执行的操作不是在创建类对象时使用您传递的参数。
似乎正确。您正在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
是一个蓝图,表示您要创建的实例。并且,所有属性name
,surname
,birthdate
,email
都特定于特定实例,并且基于这些属性,我们可以定义任何人的状态。而且,您可能需要计算Person
的多个实例,并根据您的要求计算其他属性。
在你的情况下,
class Bubble:
def __init__(self, pos, vel, colour):
pass
虽然您正在传递pos, vel, colour
,但您没有根据这些参数定义属性。这意味着,那些传递值不代表实际场景中的Bubble
。
如果您认为pos, vel, colour
是定义state
的{{1}}的属性/属性,那么您应该将您的类定义为:
class