1. 先看一段属性继承的代码:
class User: def __init__(self,name,age): self.name = name self.age = age class User1(User): def __init__(self,name,age,height,weight): self.height = height self.weight = weight # 此处像继承父类的name 和 age super().__init__(name, age) user1 = User1('thomas',38,180,80) print(user1.height) print(user1.weight) print(user1.name) print(user1.age) # 180 # 80 # thomas # 38
说明1:当然这么写一点儿毛病都没有,但是有一个问题是,我们在子类继承的时候还需要在写明父类当中的具有的属性name和age嘛?这样写有点儿麻烦。
说明2:我们如果有N个父类的参数,每次要继承父类参数的时候不带累死了,如果父类参数当中还有字典,字符串等等。如何处理?
说明3:其实这里我们就用到了*args,**kwargs可变长参数的妙用了。我们定义父类有N个不同类型的参数,再来看一下,可以如何简单的应用。
更改代码2
class User: def __init__(self,name,age,address = 'Qingdao',dicts = {'key':'value'}): self.name = name self.age = age self.address = address self.dicts = dicts class User1(User): def __init__(self,height,weight,*args,**kwargs): super().__init__(*args,**kwargs) self.height = height self.weight = weight user1 = User1(180,80,'thomas',38) print(user1.height) print(user1.weight) print(user1.name) print(user1.age) print(user1.address) print(user1.dicts) # 180 # 80 # thomas # 38 # Qingdao # {'key': 'value'}
说明1:很牛X吧?其实我们不用具体的说明父类有哪些属性参数值,用不定长参数就搞定了,这样简写了很多代码量:记住:super().__init__(*args,**kwargs)
说明2:但是注意一点。*args和**kwargs要写到最后。而且在子类的构造函数上也要写上这两个东西。