天天看點

Python類: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('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