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__()方法,建立的子類對象的時候不會再調用父類的__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('xiaoming',18,1)
# --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('xiaoming',18,1)
stu.introduce()
print(stu)
# 111
# 20
# 10
# 10
# 我叫xiaoming,今年18歲,體重1公斤
私有屬性
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