1. 程式人生 > >python中類與物件之繼承

python中類與物件之繼承

面對物件的三大特性之繼承

1.什麼是繼承?

   在程式中,繼承指的是class與class之間的關係

   繼承是一種關係,必須存在兩個class才能產生這種關係;被繼承的class稱為父類,繼承的class稱為子類。 

2.為什麼要使用繼承?

現實中,通過繼承,子可以直接使用父的內容。

在程式中,通過繼承,子類可以直接使用父類已有的程式碼

3.如何使用繼承

#繼承的定義
class Father1:
    x = 13
    print('這是父類的x', x)
    def coding(self):
        
print('我是父類的物件的繫結方法coding') @classmethod def missing(cls): print('這是父類的繫結方法missing') class Father2: y = 14 print('這是父類Father的y', y) class Son(Father1, Father2): passprint(Son.x) print(Son.y) son1 = Son() Son.coding(son1) Son.missing() son1.missing() ​ ​ ###輸出結果 13 14 我是父類的物件的繫結方法coding 這是父類的繫結方法missing
#1.命名方式: 在子類中類名加上括號,加上父類的名稱即可 #2.在python中,一個子類可以有多個父類,多個父類在括號中用逗號隔開,這一點在其他語言中是不支援的。 #3.子類中的物件可以訪問父類的屬性和方法。 #4.子類可以呼叫父類的繫結方法

 

4.抽象

抽象:就是抽取公共的父類的方法

抽象的作用:抽取多個類中相同的方法和屬性形成一個新的類

#應用如下:
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
def eating(self): print('%s要吃飯' % self.name) def sleeping(self): print('%s要睡覺' % self.name) ​ class Child(Person): def crying(self, mom): print('%s今年%s歲會哭著找媽媽%s' % (self.name, self.age, mom.name)) ​ class Adult(Person): def working(self, papa): print('%s會找老公%s' % (self.name, papa.name)) ​ xiaoming = Child('xiaoming' , 2) mom = Adult('jessic', 28) papa = Adult('egon', 30) xiaoming.crying(mom) mom.working(papa) xiaoming.eating() xiaoming.sleeping() ​ ###輸出結果 xiaoming今年2歲會哭著找媽媽jessic jessic會找老公egon xiaoming要吃飯 xiaoming要睡覺 ​ #總結: 1.通過繼承,避免了重複程式碼的書寫 2.通過抽象,避免了繼承一些不該有的方法和屬性 3.寫繼承時應該先抽象再繼承 4.在抽取過程中,可能會有一些跟業務需求無關的類這是正常的,這些稱為公共父類。 5.公共父類的作用是儲存多個子類相同的屬性和方法

 

5.派生

派生指的是子類繼承父類,並且擁有自己獨特的屬性或技能,該子類稱為派生。派生類一定是子類。

#為什麼有派生類?
#因為子類可能有自己獨特的屬性需要新增
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def say_hi(self):
        print("hello my name is %s,i'm %s years old" % (self.name, self.age))
​
class Student(Person):
    def __init__(self, name, age, adress):
        self.name = name
        self.age = age
        self.adress = adress
    def attend_class(self):
        print('%s家在%s,%s歲,要好好學習' % (self.name, self.adress, self.age))
​
daidai = Student('daidai', 26, 'china')
daidai.say_hi()
daidai.attend_class()
hello my name is daidai,i'm 26 years old
daidai家在china,26歲,要好好學習
​
#Student就是一個派生類

 


6.子類訪問父類的方法和屬性

在派生中,相同的初始化屬性,相同部分寫了重複程式碼

有兩種方式可以讓子類訪問父類的方法和屬性

class Student(Person):
    def __init__(self, name, age, adress):
        #第一種呼叫方式:在子類中重用父類方法。這種呼叫方式與繼承關係無關
        Person.__init__(self, name, age)
        self.adress = adress
        
    def attend_class(self):
        print('%s家在%s,%s歲,要好好學習' % (self.name, self.adress, self.age))
​
daidai = Student('daidai', 26, 'china')
daidai.say_hi()
daidai.attend_class()
​
###2.
class Student(Person):
    def __init__(self, name, age, adress):
        #第二種呼叫方式:利用super()
        #super()表示建立一個特殊物件,可用於呼叫父類
        super().__init__(name,age)
        # Person.__init__(self, name, age)
        self.adress = adress
    def attend_class(self):
        print('%s家在%s,%s歲,要好好學習' % (self.name, self.adress, self.age))
​
daidai = Student('daidai', 26, 'china')
daidai.say_hi()
daidai.attend_class()
​
##瞭解
在python2中,super()的使用方法有所不同,需要寫成:
super(Student, self).__init__(name, age)
#其中Student表示父類,self表示是物件本身

 

7.繼承後子類的屬性查詢

class S:
    x = 1class A(S):
    x = 2class B(A):
    x = 3
​
b = B()
b.x = 4
print(b.x)
​
子類物件和物件的查詢方法的查詢順序:
物件——>B(子類)——>A(父類)——>S(父類)
​
#如果一個子類有多個父類時查詢順序
#1.如果父類不存在自己的父類時,按照繼承的順序去查詢BASC
#2.如果父類還有自己的父類時,則按照繼承順序沿一條線找到底(深度查詢)
#3.如果存在兩層關係還有公共關係時,會按照廣度優先原則查詢,也就是最後一層不會先找,先按照深度原則找完父類,然後再找父類的公共類
class C:
    x = 5
class S:
    x = 1class A:
    x = 2class B(A, S, C):
    x = 3
​
b = B()
b.x = 4
print(b.x)
​
​
#注意:
1.在經典類中,屬性的查詢只按照深度查詢原則
2.只有在python2中才有經典類

 

8.經典類和新式類

所有直接繼承或者間接繼承object的類,都是新式類,object稱之為根類,意思時所有類都是源自object類

  • 為什麼這麼設計?

    建立物件時,需要申請記憶體空間,建立新的名稱空間,將物件的屬性放入名稱空間,這一複雜的基礎操作都是由object完成的。簡單來說就是object提供了一些常用的基礎操作

注意:

1.在python3中,所有類都是object的子類,所有類都是新式類

2.在python2中,預設的是經典類,不會繼承object

#區別
#python3中定義類
class Cls():
    print('python3中定義類')
    
#python2中
class Cls(Object):
    print('python2中定義類')

 

  • ——base——的作用

    class Cls():
        print('python3中定義類')
    Cls.__base__#Cls.__base__用於檢視父類
    ​
    ​
    Cls.mor()
    .mor()顯示屬性列表