python的类定义的属性如果是列表为什么要预先赋值一个空列表

class Privileges():
	def __init__(self,privileges=[]):
		self.privileges=['can add post','can delete post','can ban users']
	def show_privileges(self):
		for privilege in self.privileges:
			print(" --"+privilege)
			
admin=Admin('bruce','lee')
admin.privileges.show_privileges()

请问为什么第二行的privileges后面要预先赋值一个空列表呢?否则就会报错。

class Privileges():
    def __init__(self,privileges):
        self.privileges = privileges
    def show_privileges(self):
        for privilege in self.privileges:
            print("Admin" + privilege)
admin = Privileges([' can add post',' can delete post',' can ban user'])
admin.show_privileges()

我知道赋予空列表是给一个默认值,但如果是上面这样编写,那第二行的privilegs为什么就不用预先赋予一个空列表呢?

你的第一个是直接将['can add post','can delete post','can ban users']赋值给了类的属性privileges,在实例化类时,因为有默认参数,所以你没传参也没报错啊,而第二个是将['can add post','can delete post','can ban users']当做privileges参数传入到了Privileges类中,这时候没有默认参数,你传参了所以不报错,不传参就会报错啊

 

这是没有默认值的,也就是说必须传入privileges参数,否则会报错:

class Privileges():
    def __init__(self,privileges):
        self.privileges=privileges
    def show_privileges(self):
        for privilege in self.privileges:
            print("Admin"+privilege)

admin = Privileges([' can add post',' can delete post',' can ban user'])
admin.show_privileges()

这是有默认值的,可以不传入参数:

class Privileges():
    def __init__(self,privileges=[]):
        self.privileges = privileges
    def show_privileges(self):
        for privilege in self.privileges:
            print("Admin" + privilege)
            
admin = Privileges()
admin.show_privileges()

也可以传入参数:

class Privileges():
    def __init__(self,privileges=[]):
        self.privileges = privileges
    def show_privileges(self):
        for privilege in self.privileges:
            print("Admin" + privilege)
            
admin = Privileges([' can add post',' can delete post',' can ban user'])
admin.show_privileges()

 

 

class Privileges():
    def __init__(self):
        self.privileges=[' can add post',' can delete post',' can ban user']
    def show_privileges(self):
        for privilege in self.privileges:
            print("Admin"+privilege)
 
admin = Privileges()
admin.show_privileges()

如果你直接给类的privileges属性赋值,那你privileges变量就可以删除了呀

class Privileges():
    def __init__(self,a):
        self.privileges=a
    def show_privileges(self):
        for privilege in self.privileges:
            print("Admin"+privilege)

a = [' can add post',' can delete post',' can ban user']
admin = Privileges(a)
admin.show_privileges()

 

class A:
    def __init__(self, a, b=1):
        print('没有默认参数',a)
        print('有默认参数',b)
        self.b = b
        
    def hanshu(self):
        print(a)
        print(self.b)

c = A(a=0)
c.hanshu()

这个赋值给属性的作用在于之后的其他函数可以直接 self.属性名称 调用这个属性的值,如果不赋值给属性的话,就像上面这个a,在hanshu()里面调用会出错的:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-e3deed356b4f> in <module>
     10 
     11 c = A(a=0)
---> 12 c.hanshu()
     13 
     14 d = A(3,4)

<ipython-input-1-e3deed356b4f> in hanshu(self)
      6 
      7     def hanshu(self):
----> 8         print(a)
      9         print(self.b)
     10 

NameError: name 'a' is not defined