Python 以下三种方式在构造函数中声明属性有什么区别?
你能解释一下幕后发生了什么吗?蒂亚Python 以下三种方式在构造函数中声明属性有什么区别?,python,python-3.x,constructor,attributes,Python,Python 3.x,Constructor,Attributes,你能解释一下幕后发生了什么吗?蒂亚 “分数”成员始终设置为[] 您可以选择指定要将成员“分数”设置为什么 在构造对象时,必须指定“分数”。差额为2。就是说,这里您有来指定它,而在2中。这是可选的,您只需设置一个默认值 self.score始终初始化为空列表 def init(self): self.score=[] 调用方可以传入可选的列表参数。如果没有,则在定义函数时,self.score将初始化为空列表一次。(请参阅了解为什么这是一个坏主意。) 调用者必须传入一个列表参数(通常,该
self.score
始终初始化为空列表
def init(self):
self.score=[]
调用方可以传入可选的列表参数。如果没有,则在定义函数时,self.score
将初始化为空列表一次。(请参阅了解为什么这是一个坏主意。)
调用者必须传入一个列表参数(通常,该参数将被分配给self.score
,但您将抛出该值并将self.score
设置为空列表)。第三个例子可能是:
def init(self,score):
self.score=[]
在第一个变量中,始终将[]分配给objects score变量。 在第二种方法中,您可以构造包含或不包含score值的对象,例如,如果执行obj=object([1,2,3]),那么它的score将等于[1,2,3],但您也可以在不使用score参数的情况下调用它,如obj=object(),并且它的score将等于[]。
在第三个示例中,您必须使用score参数创建,但它将被忽略,因为它没有分配给self.score变量。
函数头中的score
是一个局部变量
def init(self, score):
self.score = score
这里是一个实例属性
def init(self,score):
第一个和最后一个方法具有完全相同的效果:为实例属性
score
指定一个空列表。出于某种奇怪的原因,第三个参数需要一个额外的位置参数score
,但没有使用
中间的一个为参数
score
创建并保留默认值;在解析时,该值是一个空列表。任何省略该参数的实例化都会被分配到保留列表。这里的危险在于,这些实例化都将引用同一个列表:其中一个中score
属性的更改将反映在使用默认值的所有其他对象中。第三个实例化有些毫无意义,因为它产生的结果与第一个实例化相同。第二个是(可能是)a。Python中没有属性声明。在任何情况下,这与它们恰好是\uuuuu init\uuuu
方法无关,这只是询问不同类型的参数之间的区别……”“如果它们没有,self.score将初始化为空列表。”严格来说,这不是真的。它初始化为作为默认参数的对象。例如,如果对象发生变异,它可能是空列表,也可能不是空列表。如果您不知道可变默认参数是如何工作的,那么它们是危险的work@juanpa.arrivillaga你说得对。当IDE没有警告我时,我总是忘记这一点。我更新了我的答案。
def init(self, score):
self.score = score
def init(self,score):
self.score=[]