python——繼承

一、繼承特性

1、什麼是繼承
繼承就是讓類和類之間產生父子關係,子類可以擁有父類的靜態屬性和方法。
[繼承就是可以獲取另外一個類中的靜態屬性和普通方法。(並非所有成員)]。
在python中,新建的類可以繼承一個或多個父類,父類又可稱爲基類或超類,新 建的類稱爲派生類或子類。 注意:python中的繼承分爲:單繼承和多繼承。

2、繼承中的子類和父類的概念
父類:用於被繼承的類,稱之爲父類,也叫做基類,或者超類。
子類:繼承其他類的類,稱之爲子類,也叫做派生類。

3、繼承的作用 就是提高代碼的重用率

練習1:創建Dog類和Cat類,分別設置name,gender,age屬性和定義eat()、

class Animal(object):
    def __init__(self,name,gender,age):
        self.age=age
        self.name=name
        self.gender=gender
    def eat(self):
        print("吃。。。。")
    def sleep(self):
        print("睡。。。。")
    def __str__(self):
        return "性別{},年齡{}".format(self.name,self.gender,self.age)
class Dog(Animal):
    def bite(self):
        print("汪汪。。。")
xiaotiandog=Dog("哮天犬","母",21)
xiaotiandog.eat()
xiaotiandog.sleep()
xiaotiandog.bite()

結果:

吃。。。。
睡。。。。
汪汪。。。

3、查看繼承的父類

格式:類名.bases
注意: (1).python3中如果一個類沒有繼承任何類,默認繼承object類。我們管這種類叫 做新式類。
(2).object類,是python中的祖宗,所有的類都是從object類中繼承下來的。

4、方法的覆寫

子類中定義了和父類中相同的方法,我們叫做方法的複寫(派生方法)。
實例對 象調用此方法 的時候就會調用自己類中的方法了。

練習1:定義一個Person類創建eat()方法,定義一個Student的類,創建eat()方 法, 規定學生去食堂吃飯,定義一個Boss類創建eat()方法,規定Boss去酒店吃。


class Person(object):
    def eat(self):
        print("吃飯")
class Student(Person):
    def eat(self):
        print("去食堂吃飯")
class Boss(Person):
    def eat(self):
        print("去酒店吃飯")


student=Student()
student.eat()
boss=Boss()
boss.eat()

結果:

去食堂吃飯
去酒店吃飯

5、super()
子類和父類有相同的方法,如果子類想調用父類相同的的方法。可以使用 super()方法。
在python3中,子類執行父類的方法也可以直接用super方法 ­­­>super() super默認省略了兩個參數 第一個參數是類名,第二個參數是self。
兩個參數可 以省略不傳遞例如 super(Student,self) super()還可以從類的外部使用 需要傳遞類名(本類的名稱)和對象名
例如 super(Student,student)

格式: 父類類名.方法名稱(self) 或者 super().方法名稱()或者super(本類類名,對象名)

6、init()方法 ­ 子類繼承父類,如果子類不復寫父類的init()方法,

創建子類對象的時候會自動調用父類init()方法。 ­

子類繼承父類,如果子類複習了父類的init()方法,

創建的子類對象的時候不會再調用父類的init() 方法。

­ 注意:python要求複習父類的init()方法時,需要調用父類的init()   因爲存在隱患,
例如父類的初始化方法有參數,子類初始化無參數,子類再調 用父類   的參數的時候就會報錯。
class People(object):
    def __init__(self,name,age,sex):
        print("person------>")
        self.name=name
        self.age=age
        self.sex=sex
    def say(self):
        print("大家好,我是{},今年{}歲,".format())

class Student(People):
    def __init__(self,name,sex,age,score):
        super().__init__(name,sex,age)
        self.score=score
    def talk(self):
        print("我是{},成績{}".format(self.name,self.score))
s=Student("王五","男",23,89)
s.talk()

結果:

person------>
我是王五,成績89

7、派生屬性 屬性的覆蓋(派生屬性):子類也可以添加自己新的屬性或者在自己這裏重新定義 這些屬性(不會影響到父類),需要注意的是,一旦重新定義了自己的屬性且與 父類重名,那麼調用新增的屬性時,就以自己爲準了(屬性的覆蓋)。

8、私有屬性私有方法在繼承中的表現
父類中的私有方法和私有屬性都是不能被子類繼承下來的。

9、抽象類
之前我們定義了Person類實現了eat()、drink()方法, 每種人都會吃喝但是吃喝的地點不同,如果實現了方法體就浪費了。因此我們可 以只定義eat()方法,不實現方法體,這種形式我們可以將方法定義爲抽象方 法,具有抽象方法的類就叫做抽象類。 抽象類是一個特殊的類,只能被繼承,不能實例化,抽象類中可以有抽象方法和 普通方法。

(1) .定義抽象類 定義抽象類需要導入 abc模塊。from abc import ABCMeta, abstractmethod

import abc
class Person(metaclass=abc.ABCMeta):
    @abc.abstractclassmethod
    def eat(self):
        pass
    @abc.abstractclassmethod
    def sleep(self):
        pass
    def breathe(self):
        print("呼吸空氣")
class Man(Person):
    def eat(self):
        print("吃軟飯。。。。")
    def sleep(self):
        print("睡學校。。。。")
class Women(Person):
    def eat(self):
        print("吃硬菜。。。。")
發佈了37 篇原創文章 · 獲贊 49 · 訪問量 4067
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章