最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Python中的繼承

 更新時間:2020年06月19日 14:33:18   作者:BlackMonkey  
這篇文章主要介紹了Python中繼承的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下

繼承

Python 中所有的類都是object類的子類,而object 繼承自type

繼承分為 接口繼承和實現(xiàn)繼承

接口繼承:使用父類的接口名,子類重寫這個方法。盡可能的繼承接口類,在子類中實現(xiàn)方法,鼓勵對接口類的多繼承,這樣遵循接口隔離原則,有利于歸一化設(shè)計,不提倡對抽象類進行多繼承

實現(xiàn)繼承:子類不需要實現(xiàn)任何東西,直接使用父類接口和實現(xiàn)會增強代碼的耦合性,不推薦使用。

一些細節(jié)

類繼承最終要被實例化,我們多數(shù)時候使用的還是對象而不是類。因此我們還是來一點點看繼~

繼承的過程

承僅僅是一種代碼復用的手段,并不會講代碼全部的加載到子類的空間中,方法依然屬于父類。下面的例子能看到,Cat.func 依然是 Animal 的,更近一步的理解,func 也僅僅是func,它只是被綁定到了類 Animal上而已,類 只是能幫我們找到這個函數(shù),子類通過父類找到這個函數(shù)就完了~ 。

class Animal(object):

  def func(self):
    print("Animal.func")


class Dog(Animal):

  def func(self):
    print('Dog.func')


class Cat(Animal):
  """ No func~ """


print(Animal.func)  # <function Animal.func at 0x103f79620>
print(Cat.func)  # <function Animal.func at 0x103f79620>
print(Dog.func)  # <function Dog.func at 0x104073510>

實例化的過程

實例化過程中屬性和方法并不會出現(xiàn)在實例的空間里。它們依然屬于類本身,對象也只是能找到他們,然后調(diào)用他們。但是當修改對象的屬性時,會在對象的空間中創(chuàng)建同名的屬性。這是屬于對象的屬性。復雜的繼承其本質(zhì)也是一樣的。

class Animal(object):

  def tell(self):
    print('self.name:%s Animal.name %s ' % (id(self.name), id(Animal.name)))

  name = 'Animal'


class Cat(Animal):
  """ No func~ """

  def tell(self):
    super().tell()
    print('self.name %s Cat.name %s '% (id(self.name), id(Cat.name)))

cat = Cat()
cat.tell()
cat.name = 'django'
cat.tell()

# self.name:4473398472 Animal.name 4473398472 
# self.name 4473398472 Cat.name 4473398472 
# self.name:4474859736 Animal.name 4473398472 
# self.name 4474859736 Cat.name 4473398472 

單繼承

越靠近本類的方法會覆蓋祖輩的方法,這叫方法的覆蓋或重寫 原理是 Python的屬性檢索機制 從內(nèi)層命名空間往外查詢

class MyClass(object):
  """
  A simple example class
  """
  MyClassName = 'MyClass'
  name = 'MyClass'

  def func(self):
    print("This is {}".format(self.__class__.name))

  def get_name(self):
    print(self.name)

class MySonClass(MyClass):

  MySonClass = 'MySonClass'
  name = 'MySonClass' # 屬性的重寫

  def get_name(self):
    super().get_name()
    print('我重寫了父類的get_name方法,上面是父類的方法,我來自子類!')


person1 = MyClass()
person2 = MySonClass()

person1.func()
person2.func()  # 方法的實現(xiàn)繼承 自己沒有,會直接調(diào)用父類的方法。但是使用的屬性還是自己的。
print('*'*40)
person1.get_name()
person2.get_name()  # 方法的接口繼承,在子類中重寫了這個方法。


# 結(jié)果	
#------------------------------ 
# This is MyClass
# This is MySonClass
# ****************************************
# MyClass
# MySonClass
# 我重寫了父類的get_name方法,上面是父類的方法,我來自子類!

多繼承

就形式上來說,類的繼承列表可以是一個,也可以是多個,當繼承列表只有一個類時,也就是只有一個父類時,稱為單繼承,大于一個類,就稱為多繼承。

新式類的繼承方式為 廣度優(yōu)先繼承 經(jīng)典類的繼承方式為 深度優(yōu)先繼承。

類繼承的順序可以使用類的 __mro__ 方法查看。

鉆石繼承

class A(object):
  m = 'a'
class B(A):
  m = 'b'
class C(A):
  m = 'c'
class D(B,C):
  # m = 'd'
  pass
x = D()
print(x.m)

# D 的實例化對象如果獲取 m 屬性會優(yōu)先的尋找自己的命名空間,查找順序為 D -> B -> C -> A

super()方法

語法super(類,實例化對象).父類的方法

當super()方法在類的內(nèi)部使用時候,甚至不需要任何的參數(shù)

當在多繼承中使用super()方法的時候執(zhí)行的不再是父類的方法了 而是和mro中上一級的方法

super()為了解決多繼承中,初始化方法被重復調(diào)用的問題。(當使用類名.方法名的時候)

當使用super()方法執(zhí)行“父類” (__mro__ 方法的上一個類) 的方法

# 鉆石繼承中的 重復調(diào)用問題
# 注意 繼承的查找順序~ 使用super()將按照 mro 順序執(zhí)行

class Grand(object):
  def __init__(self, name):
    self.name = name
    print("class Grand ")


class SonLeft(Grand):
  def __init__(self, age, name):
    self.age = age
    Grand.__init__(self, name) # 注釋調(diào) 跑一跑 看一看
    # super().__init__(age, name)
    print("class SonLeft")


class SonRight(Grand):
  def __init__(self, gender, name):
    self.gender = gender
    Grand.__init__(self, name) # 注釋調(diào) 跑一跑 看一看
    # super().__init__(name)
    print("class SonRight")


class GrandSon(SonLeft, SonRight):
  def __init__(self, name, age, gender):
    # super().__init__(age, name)
    SonLeft.__init__(self, age, name) # 注釋調(diào) 跑一跑 看一看
    SonRight.__init__(self, gender, name) # 注釋調(diào) 跑一跑 看一看
    self.gender = gender

grand_son = GrandSon("Monkey", 18, "男")

以上就是淺談Python中的繼承的詳細內(nèi)容,更多關(guān)于Python 繼承的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • django 使用內(nèi)置messages的操作

    django 使用內(nèi)置messages的操作

    這篇文章主要介紹了django 使用內(nèi)置messages的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Django 允許局域網(wǎng)中的機器訪問你的主機操作

    Django 允許局域網(wǎng)中的機器訪問你的主機操作

    這篇文章主要介紹了Django 允許局域網(wǎng)中的機器訪問你的主機實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python3 用什么IDE開發(fā)工具比較好

    Python3 用什么IDE開發(fā)工具比較好

    這篇文章主要介紹了Python3 用什么IDE開發(fā)工具比較好,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • python asyncio 協(xié)程庫的使用

    python asyncio 協(xié)程庫的使用

    這篇文章主要介紹了python asyncio 協(xié)程庫的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • 詳解python數(shù)據(jù)結(jié)構(gòu)和算法

    詳解python數(shù)據(jù)結(jié)構(gòu)和算法

    這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)和算法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Python使用scipy進行曲線擬合的方法實例

    Python使用scipy進行曲線擬合的方法實例

    這篇文章主要給大家介紹了關(guān)于Python使用scipy進行曲線擬合的相關(guān)資料,Scipy優(yōu)化和擬合采用的是optimize模塊,該模塊提供了函數(shù)最小值(標量或多維)、曲線擬合和尋找等式的根的有用算法,需要的朋友可以參考下
    2022-05-05
  • Python創(chuàng)建數(shù)字列表的示例

    Python創(chuàng)建數(shù)字列表的示例

    今天小編就為大家分享一篇Python創(chuàng)建數(shù)字列表的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python實現(xiàn)半角轉(zhuǎn)全角的方法示例

    Python實現(xiàn)半角轉(zhuǎn)全角的方法示例

    本文介紹了使用Python實現(xiàn)半角字符到全角字符的轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • Python3實現(xiàn)計算兩個數(shù)組的交集算法示例

    Python3實現(xiàn)計算兩個數(shù)組的交集算法示例

    這篇文章主要介紹了Python3實現(xiàn)計算兩個數(shù)組的交集算法,結(jié)合2個實例形式總結(jié)分析了Python3針對數(shù)組的遍歷、位運算以及元素的添加、刪除等相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • python中numpy數(shù)組的csv文件寫入與讀取

    python中numpy數(shù)組的csv文件寫入與讀取

    本文主要介紹了python中numpy數(shù)組的csv文件寫入與讀取,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03

最新評論

丁青县| 长乐市| 云阳县| 翼城县| 久治县| 丹巴县| 桐乡市| 馆陶县| 五常市| 花莲县| 香港 | 井陉县| 浪卡子县| 大姚县| 定陶县| 德化县| 忻城县| 顺昌县| 清涧县| 安达市| 丹寨县| 泾川县| 贵南县| 新竹县| 利津县| 霞浦县| 沛县| 福建省| 庄河市| 望城县| 河北区| 昌黎县| 西畴县| 岳阳县| 凤翔县| 临朐县| 高邑县| 钟山县| 永福县| 商丘市| 绥化市|