亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談Python中的繼承

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

繼承

Python 中所有的類(lèi)都是object類(lèi)的子類(lèi),而object 繼承自type

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

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

實(shí)現(xiàn)繼承:子類(lèi)不需要實(shí)現(xiàn)任何東西,直接使用父類(lèi)接口和實(shí)現(xiàn)會(huì)增強(qiáng)代碼的耦合性,不推薦使用。

一些細(xì)節(jié)

類(lèi)繼承最終要被實(shí)例化,我們多數(shù)時(shí)候使用的還是對(duì)象而不是類(lèi)。因此我們還是來(lái)一點(diǎn)點(diǎn)看繼~

繼承的過(guò)程

承僅僅是一種代碼復(fù)用的手段,并不會(huì)講代碼全部的加載到子類(lèi)的空間中,方法依然屬于父類(lèi)。下面的例子能看到,Cat.func 依然是 Animal 的,更近一步的理解,func 也僅僅是func,它只是被綁定到了類(lèi) Animal上而已,類(lèi) 只是能幫我們找到這個(gè)函數(shù),子類(lèi)通過(guò)父類(lèi)找到這個(gè)函數(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>

實(shí)例化的過(guò)程

實(shí)例化過(guò)程中屬性和方法并不會(huì)出現(xiàn)在實(shí)例的空間里。它們依然屬于類(lèi)本身,對(duì)象也只是能找到他們,然后調(diào)用他們。但是當(dāng)修改對(duì)象的屬性時(shí),會(huì)在對(duì)象的空間中創(chuàng)建同名的屬性。這是屬于對(duì)象的屬性。復(fù)雜的繼承其本質(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 

單繼承

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

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' # 屬性的重寫(xiě)

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


person1 = MyClass()
person2 = MySonClass()

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


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

多繼承

就形式上來(lái)說(shuō),類(lèi)的繼承列表可以是一個(gè),也可以是多個(gè),當(dāng)繼承列表只有一個(gè)類(lèi)時(shí),也就是只有一個(gè)父類(lèi)時(shí),稱(chēng)為單繼承,大于一個(gè)類(lèi),就稱(chēng)為多繼承。

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

類(lèi)繼承的順序可以使用類(lèi)的 __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 的實(shí)例化對(duì)象如果獲取 m 屬性會(huì)優(yōu)先的尋找自己的命名空間,查找順序?yàn)?D -> B -> C -> A

super()方法

語(yǔ)法super(類(lèi),實(shí)例化對(duì)象).父類(lèi)的方法

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

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

super()為了解決多繼承中,初始化方法被重復(fù)調(diào)用的問(wèn)題。(當(dāng)使用類(lèi)名.方法名的時(shí)候)

當(dāng)使用super()方法執(zhí)行“父類(lèi)” (__mro__ 方法的上一個(gè)類(lèi)) 的方法

# 鉆石繼承中的 重復(fù)調(diào)用問(wèn)題
# 注意 繼承的查找順序~ 使用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中的繼承的詳細(xì)內(nèi)容,更多關(guān)于Python 繼承的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論