25. 企業級開發基礎6:物件導向特徵(繼承)
物件導向程式設計最主要的有三個特徵:封裝、繼承、多型
本節內容主要講解物件導向的第一個特徵:繼承
1 繼承的意義
繼承是讓我們抽象的物件之間存在一定的所屬關係 在繼承關係中,我們一定要明確會出現這樣的一種關係~父類、子類,子類繼承自父類,可以繼承父類中的公開的屬性和方法(不能繼承私有的屬性或者方法)
其實我們在前面定義物件的時候已經使用過了繼承,python中所有的物件都是直接或者間接繼承自object物件的
```
class Person(object):
pass
```
上述程式碼中,我們定義了一個型別Person,這個Person後面有一個括號,括號中就是繼承的型別;python中繼承的語法是
```
class 型別名稱(父類名稱):
pass
```
下面是一個簡單的繼承的案例
```
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 定義一個人的型別
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
class Person(object):
def __init__(self, name, age, gender):
self.__name = name
self.__age = age
self.__gender = gender
# 定義get獲取屬性的方法
def get_name(self):
return self.__name
def get_age(self):
return self.__age
def get_gender(self):
return self.__gender
# 定義set設定屬性的方法
def set_name(self, name):
self.__name = name
def set_age(self, age):
self.__age= age
def set_gender(self, gender):
self.__gender= gender
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 定義一個男人的型別,繼承自Person型別
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
class Man(Person):
def __init__(self, name, age):
Person.__init__(self, name, age, "男")
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 定義一個女人的型別,繼承自Person型別
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
class Women(Person):
def __init__(self, name, age):
Person.__init__(self, name, age, "女")
# 建立男人物件和女人物件,測試是否可以給屬性進行賦值取值
m = Man("tom", 18)
w = Women("jerry", 16)
print(m.get_gender()) # 執行結果:男
print(w.get_gender()) # 執行結果:女
```
我們可以看到,在自定義類Man和Women中,只是簡單定義了一個init方法,沒有其他的程式碼,但是我們建立的Man型別的物件和Women型別的物件,卻可以使用父類Person中定義的方法get_gender()以及其他,在一定程度上,簡化了我們的開發,同時提高了程式的擴充套件性
繼承:就是將一部分表示資料型別相似的類,抽取他們共同的屬性和方法單獨封裝成父類,讓這些類繼承這個父類,實現程式碼的複用的同時提高程式的擴充套件性。
2. 繼承中型別的關係
繼承是型別之間的關係:繼承中,首先必須是兩個或者兩個以上的型別之間的關係,注意是型別之間的關係
繼承中的父類和子類:被繼承的稱為父類,實現繼承的稱為子類,子類繼承自父類,實現的是一種A is a B的關係 如:貓是一種型別,繼承自動物這種型別,反映出來的是貓這種型別可以具備動物具備的屬性和行為,同時貓是一種動物。(切記,A繼承B反映的是A is a B的關係,不能反過來,貓是一種動物,不能說動物是貓)
多繼承機制:一個父類可以有多個子類,一個子類同樣也可以有多個父類
```
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # 定義一個人的型別,男人是人,女人也是人 # 一個父類,多個子類 # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # 父類 class Person(object): pass # 子類 class Man(Person): pass # 子類 class Women(Person): pass
```
某些情況下,我們生活中會出現這樣的情況,一個小孩既是父親的兒子,要具備兒子應該具備的功能,同時也是一個學生要具備學生應該具備的功能,此時就需要使用Python中的多繼承來實現了
```
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# 定義一個兒子的型別~要孝順
# 定義一個學生的型別~要好好學習天天向上
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
class Son(object):
def fealty(self):
print("孝順父母")
class Student(object):
def study(self):
print("好好學習,天天向上")
# 定義子類,繼承兒子型別和學生型別
class Person(Son, Student):
pass
# 建立物件,使用父類的方法
p = Person()
p.fealty()
p.study()
# 執行結果
~ 孝順父母
~ 好好學習,天天向上
```
資料繼承和訪問,在python的繼承機制中,私有的屬性是不允許被繼承和互相訪問的,子類不能繼承和訪問父類中私有的屬性和方法,父類同樣也不能訪問子類中私有的屬性和方法 子類只能繼承父類中公開的屬性和方法 子類中可以通過父類的名稱或者super()來訪問父類的屬性和方法
```
# 父類 class Person(object): def __init__(self, name, age): self.__name = name self.__age = age def play(self): print(self.__name + "在玩遊戲") # 子類 class Man(Person): def __init__(self, name, age): # 通過父類名稱訪問父類中初始化的方法 Person.__init__(self, name,age) # 子類 class Women(Person): def __init__(self, name, age): # 通過super()訪問父類初始化的方法 # super(Women, self).__init....super中的引數可以省略 super().__init__(self, name, age)
```
3. 繼承時的方法重寫(方法覆蓋)
在子類繼承自父類之後,可以直接使用父類中定義的公開的方法進行操作
```
# 父類
class Person(object):
def play(self):
print("Person中玩遊戲的方法執行了...")
# 子類
class Children(Person):
pass
# 建立子類物件
c = Children()
c.play()
# 執行結果
~Person中玩遊戲的方法執行了...
```
在子類中,我們可以重新編寫繼承自父類的方法 ```
# 父類
class Person(object):
def play(self):
print("Person中玩遊戲的方法執行了...")
# 子類
class Children(Person):
# 重寫父類中play方法
def play(self):
print("Children中玩遊戲的方法執行.....")
# 建立子類物件
c = Children()
c.play()
# 執行結果
~Children中玩遊戲的方法執行.....
```
在繼承關係下,在子類中將繼承自父類的方法進行重新定義的過程,稱為方法重寫或者方法覆蓋,經過重寫或者覆蓋的方法,子類執行該方法時,執行的就是重寫過的方法。
相關文章
- 26. 企業級開發基礎7:物件導向特徵(多型)物件特徵多型
- 24. 企業級開發基礎5:物件導向特徵(封裝)物件特徵封裝
- 23. 企業級開發基礎4:物件導向物件
- 27. 企業級開發基礎8:物件導向擴充套件物件套件
- 物件導向:繼承物件繼承
- 物件導向--繼承物件繼承
- 物件導向-繼承物件繼承
- 物件導向基礎(1)--繼承 多型 重構物件繼承多型
- JAVA物件導向基礎--封裝 繼承 多型Java物件封裝繼承多型
- [.net 物件導向程式設計基礎] (12) 物件導向三大特性——繼承物件程式設計繼承
- 物件導向三大特徵(封裝/繼承/多型)物件特徵封裝繼承多型
- 【Java】瘋狂Java基礎(一)——物件導向的特徵:繼承、封裝和多型Java物件特徵繼承封裝多型
- Golang物件導向_繼承Golang物件繼承
- java物件導向繼承Java物件繼承
- 物件導向之繼承物件繼承
- php物件導向--繼承PHP物件繼承
- 物件導向之_繼承概念物件繼承
- Javascript物件導向與繼承JavaScript物件繼承
- [JAVA] Java物件導向三大特徵:封裝、繼承、多型Java物件特徵封裝繼承多型
- 【Java基礎】物件導向開發Java物件
- Javascript實現物件導向繼承JavaScript物件繼承
- 21. 物件導向之繼承物件繼承
- 物件導向的三個基本特徵是:封裝、繼承、多型物件特徵封裝繼承多型
- Kotlin 物件導向程式設計 (OOP) 基礎:類、物件與繼承詳解Kotlin物件程式設計OOP繼承
- iOS開發-物件導向三大特徵iOS物件特徵
- 物件導向 -- 三大特性之繼承物件繼承
- 說清楚javascript物件導向、原型、繼承JavaScript物件原型繼承
- JavaScript物件導向 ~ 原型和繼承(1)JavaScript物件原型繼承
- 5-Java物件導向-繼承(下)Java物件繼承
- 《JavaScript物件導向精要》之五:繼承JavaScript物件繼承
- java學習——物件導向之繼承Java物件繼承
- JavaScript物件導向—繼承的實現JavaScript物件繼承
- php物件導向多繼承實現PHP物件繼承
- JavaScript物件導向那些東西-繼承JavaScript物件繼承
- Effective C++:物件導向與繼承C++物件繼承
- JAVA物件導向高階一:繼承Java物件繼承
- JS物件導向程式設計(四):繼承JS物件程式設計繼承
- go物件導向思想:封裝、繼承、多肽Go物件封裝繼承