python-面向對象-17-繼承/object類/mro方法

1.繼承的基本概念

繼承是面向對象程序設計的重要特徵,也是實現"代碼複用"的重要手段。
若是一個新類繼承自一個設計好的類,就直接具有已有類的特徵,這樣就大大下降了工做難度,由於不少事情父類已經作了,不須要再從新作一遍,減小重複勞動。已有的類,咱們稱爲父類或者基類,新的類,咱們稱爲子類或者派生類python

繼承關係示意圖:
動物繼承關係git

繼承語法格式:github

class 子類類名[(父類1 [, 父類2, ...])]
    類體結構

說明:markdown

  1. 由於Python語言和C++同樣是支持多重繼承的,全部在繼承的時候能夠繼承多個類。 備註:關於多重繼承的內容,後面的筆記會有具體說明

2.object類

2.1 object基礎說明

在python中,全部類都繼承自類object,也稱之爲根基類
當定義類的時候,只有類名,沒有繼承的相關參數時,則此時默認繼承類object。 從另一個角度理解,全部的類繼承關係最上層都是類object,類object是全部類的父類,在object類中定義了全部類的共有的默認實現,好比:__new__()__init__()等很是常見的方法。ssh

2.2 mro方法定義

def mro(self, *args, **kwargs): # real signature unknown
        """ Return a type's method resolution order. """
        pass

返回type方法的解析順序,也就對應着類的繼承關係。ide

2.3 示例代碼

class Person:
    pass

class Student(Person):
    pass

print("使用mro函數")
print(Student.mro())

print("--" * 20)
print("使用__mro__屬性")
print(Student.__mro__)

運行結果:函數

使用mro函數
[<class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>]
----------------------------------------
使用__mro__屬性
(<class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>)

代碼說明:spa

  1. 使用mro方法和__mro__屬性,兩個的運行結果是一致的,說明在底層,二者相同。其中一個屬於包裝修飾的功能。
  2. 在代碼中,咱們首先定義類Person,沒有指定繼承關係;而後定義類Student,顯示繼承類Person;運行結果中,首先是類Student自身,而後是類Person,這個是由於咱們顯示繼承的緣由形成的。最後一個是類object,這個在一次說明,若是不指定繼承關係,則默認繼承類object

3.繼承過程當中注意事項

  1. 定義子類時,必須早其構造函數中調用父類的構造方法,調用格式以下:

父類名.__init__(self [, 參數列表])設計

  1. 經過繼承方式獲取的父類的私有屬性和私有方法不能直接使用,只能經過子類對象名._父類名__私有屬性名的方式進行調用。

示例代碼:code

class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    def say_age(self):
        print(self.name, "的年齡是:", self.__age, sep="")

class Student(Person):
    def __init__(self, name, age, score):
        self.score = score
        # 手動調用父類的__init__方法
        Person.__init__(self, name, age)

print("使用繼承父類的公開的屬性和方法")
s1 = Student("聶發俊", 100, 100)
print("s1.name=", s1.name, sep='')
s1.say_age()


print("使用繼承父類私有的屬性和方法")
print(dir(s1))
print(s1._Person__age)
print(s1.age)

運行結果:

Traceback (most recent call last):
  File "test.py", line 27, in <module>
    print(s1.age)
AttributeError: 'Student' object has no attribute 'age'
使用繼承父類的公開的屬性和方法
s1.name=張三
聶發俊的年齡是:100
使用繼承父類私有的屬性和方法
['_Person__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_age', 'score']
6

代碼說明:

  1. 類Student繼承類Person,須要手動調用父類的__init__方法,由於這個不是__new__方法,是一個初始化方法,不是實際產生對象的方法,因此不會自動執行,須要手動調用。
  2. 子類Student使用父類Person的公開屬性和公開方法say_age()都可以正常使用,說明經過繼承,子類能夠正常使用父類的公開的方法和屬性。可是最後使用繼承父類Person的私有屬性__age的時候,報錯了,說明經過繼承,子類不能使用父類的私有屬性和私有方法。

備註:
更多精彩博客,請訪問: 聶發俊的技術博客
對應視頻教程,請訪問: python400
完整markdown筆記,請訪問: python400_learn_github
相關文章
相關標籤/搜索