Python面向對象之繼承

繼承:
    單繼承和多繼承
1.初識
class Father(object): #若是不寫object默認繼承
    pass

class Son(Father): #括號裏面的稱爲:父類或基類或超類  括號外面的稱爲:子類或派生類
    pass

class Animal:

    breath = '呼吸'

    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age

    def eat(self):
        print(self)#111   #<__main__.Person object at 0x111ac3710>
        print('動物都須要進食....')


class Person(Animal):
    pass

print(Person.breath)#呼吸
Person.eat(111)#動物都須要進食....

p1 = Person('Jake', '', 20)
print(p1.breath)#呼吸
print(p1)#<__main__.Person object at 0x111ac3710>
p1.eat()#動物都須要進食....

結果:
    呼吸
    111
    動物都須要進食....
    呼吸
    <__main__.Person object at 0x111ac3710>
    <__main__.Person object at 0x111ac3710>
    動物都須要進食....

總結:
    子類以及子類實例化的對象,能夠訪問父類的任何方法和變量。
    類名能夠訪問父類的全部內容。
    子類實例化的對象也能夠訪問父類全部內容。




只執行父類的方法:子類中不要定義與父類同名的方法
只執行子類的方法:在子類建立這個方法.

既要執行子類的方法,又要執行父類的方法?
有兩種解決方法.1.經過類名。2.經過super()函數
    1,Animal.__init__(self, name, sex, age)
    2,super().__init__(name,sex,age)

class Animal:

    breath = '呼吸'

    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age

    def eat(self, argv):
        print('%s吃%s' % (self.name, argv))


class Person(Animal):
    def __init__(self, name,sex,age,wing): 
        # Animal.__init__(self, name, sex, age)
        super().__init__(name,sex,age)  #  super(Brid,self).__init__(name,sex,age)
        self.wing = wing

    def eat(self,argv):
        super().eat(argv)
        print('吃...')

p1 = Person('鸚鵡','',20,'綠翅膀')
print(p1.__dict__)
p1.eat('金蟬')

結果:
    {'name': '鸚鵡', 'sex': '', 'age': 20, 'wing': '綠翅膀'}
    鸚鵡吃金蟬
    吃...


2.進階

類: 經典類, 新式類
新式類: 凡是繼承object類都是新式類.
    python3x 全部的類都是新式類,由於python3x中的類都默認繼承object.

經典類: 不繼承object類都是經典類
    python2x:(既有新式類,又有經典類) 全部的類默認都不繼承object類,
             全部的類默認都是經典類.你能夠讓其繼承object.


單繼承: 新式類,經典類查詢順序同樣.

多繼承:
     新式類: 遵循廣度優先.
     經典類: 遵循深度優先.

多繼承的新式類  廣度優先 : 一條路走到倒數第二級,判斷,若是其餘路能走到終點,則返回走另外一條路.若是不能,則走到終點.
多繼承的經典類  深度優先 : 一條路走到底.

相關文章
相關標籤/搜索