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将初始化为空列表一次。(请参阅了解为什么这是一个坏主意。) 调用者必须传入一个列表参数(通常,该

你能解释一下幕后发生了什么吗?蒂亚

  • “分数”成员始终设置为[]
  • 您可以选择指定要将成员“分数”设置为什么
  • 在构造对象时,必须指定“分数”。差额为2。就是说,这里您来指定它,而在2中。这是可选的,您只需设置一个默认值
  • 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=[]