Python3.x基础学习-类--super
super()方法
子类和父类有相同的方法,如果子类想调用父类的方法,可以使用super()方法
在python3中,子类执行父类的方法也可以直接用super方法 ---》super()
super默认省略了两个参数,第一个参数是当前类名,第二个参数是self
两个参数可以省略不传递例如 super(Student,self) super()还可以从类的外部使用,需要传递类名(本类的名称)和对象名
例如 super(Student,student)格式:父类类名.方法名称(self)或者super().方法名称()或者super(本类类名,对象名)
class Dog: def bite(self): print("汪汪叫") class Hsq(Dog): def bite(self): # Dog.bite(self) # super().bite() super(Hsq,self).bite() print("狂吼") hsq = Hsq() hsq.bite() Dog.bite(Dog) # 汪汪叫 # 狂吼 # 汪汪叫
__init__()方法
-子类继承父类,如果子类不复写父类的__init__()方法,常见子类对象的时候会自动调用父类__init__()方法。
-子类继承父类,如果子类复写了父类的__init__()方法,创建的子类对象的时候不会再调用父类的__init__()方法。
-注意:python要求复写父类的__init__()方法时,需要调用父类的__init__()因为存在隐患
例如父类的初始化方法有参数,子类初始化无参数,子类再调用父类的参数的时候就会报错
1.子类里没有__init__()方法,会调用父类的,有会调用自己的
2.调用父类的初始化方法,先执行父类的,再执行子类的
3.调用父类的初始化方法,如果父类方法中有参数,必须传递相应的参数,否则会报错
class Person: def __init__(self): print("---person--") class Student(Person): def __init__(self): print("--student--") stu = Student() class Person: def __init__(self,name,age): self.name = name self.age = age print("---person--") class Student(Person): pass def __init__(self,name,age,weight): super(Student,self).__init__(name,age) self.weight = weight print("--student--") stu = Student('johnson',22,111) # --student-- # ---person-- # --student--
派生属性
属性的覆盖(派生属性):子类也可以添加自己新的属性或者在自己这里重新定义 这些属性(不会影响到父类)
需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己的为准了(属性的覆盖)
class Person: num =10 def __init__(self,name,age,weight): self.name = name self.age = age self.weight = weight class Student(Person): num = 20 def __init__(self,name,age,weight): super(Student,self).__init__(name,age,weight) print(self.weight) def introduce(self): print(self.num) print(Person.num) print(super(Student,self).num) def __str__(self): return "我叫{},今年{}岁,体重{}公斤".format(self.name,self.age,self.weight) stu = Student('johnson',22,111) stu.introduce() print(stu) # 111 # 20 # 10 # 10 # 我叫johnson,今年22岁,体重111公斤
私有属性
私有方法在继承中的表现
父类中的私有方法和私有属性都是不能被子类继承下来的。
练习:测试父类中的私有属性和私有方法是否能被继承下来
class Father: def __init__(self,__name,age): self.__name = __name self.age = age def __call_name(self): print("我今年{}".format(self.age)) class Son(Father): def __init__(self,__name,age): super(Son,self).__init__(__name,age) def call_name(self): super(Son, self).__call_name() son = Son('john',25) son.call_name() #AttributeError: 'super' object has no attribute '_Son__call_name'
class A: __num = 10 def __test1(self): print("test1") def test2(self): print("test2") class B(A): def test3(self): print('test--B') # print(A.__num) self.test2() # self.__test1() # super(B,self).__test1() b= B() b.test3() # test--B # test2