1. 程式人生 > >python-----面向物件簡單理解

python-----面向物件簡單理解

  我記得之前學習java時就常常聽到,什麼是面向物件呢,“封裝,繼承,多型”。

  python中也一樣,也是這些定論。在程式中是先有類,再有物件,物件由類產生,

  物件指的是類的例項,類是建立物件的模板,一個類可以建立多個物件,每個物件都是類型別的一個變數;建立物件的過程也叫作類的例項化。

  (一)下面是一些常用的知識可以先了解一下

  類(Class): 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類的例項。
  類變數:類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。
  資料成員:

類變數或者例項變數, 用於處理類及其例項物件的相關的資料。
  方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
  區域性變數:定義在方法中的變數,只作用於當前例項的類。
  例項變數:在類的宣告中,屬性是用變數來表示的。這種變數就稱為例項變數,是在類宣告的內部但是在類的其他成員方法之外宣告的。
  繼承:即一個派生類(derived class)繼承基類(base class)的欄位和方法。繼承也允許把一個派生類的物件作為一個基類物件對待。例如,有這樣一個設計:一個Dog型別的物件派生自Animal類,這是        模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。
  例項化:
建立一個類的例項,類的具體物件。
  方法:類中定義的函式。
  物件:通過類定義的資料結構例項。物件包括兩個資料成員(類變數和例項變數)和方法。

   (二)下面的幾個python為類內建的特殊屬性

  類名.__name__# 類的名字(字串)
  類名.__doc__# 類的文件字串   類名.__base__# 類的第一個父類(在講繼承時會講)   類名.__bases__# 類所有父類構成的元組(在講繼承時會講)   類名.__dict__# 類的字典屬性   類名.__module__# 類定義所在的模組   類名.__class__# 例項對應的類(僅新式類中)

(三)主要的幾點需要理解的
  3.1 繼承:繼承是一種建立新類的方式,新建的類可以繼承一個或多個父類(python支援多繼承),父類又可稱為基類或超類,新建的類稱為派生類或子類。
        字類繼承父類後,會繼承所有屬性(資料屬性和函式屬性)。
        繼承中有一種特殊的類為抽象類,其與普通類的不同之處在於:抽象類中只能有抽象方法(沒有實現功能),該類不能被例項化,只能被繼承,且子類必須實現抽象方法。

        在字類中呼叫父類的方法有2中,1為即父類名.父類方法() 2為super()
        記得看過一位老師的教學給了一個很好的例子可以區分這2個呼叫方法
        
# 父類名.父類方法名
class A:
    def __init__(self):
        print('A的構造方法')
class B(A):
    def __init__(self):
        print('B的構造方法')
        A.__init__(self)


class C(A):
    def __init__(self):
        print('C的構造方法')
        A.__init__(self)


class D(B,C):
    def __init__(self):
        print('D的構造方法')
        B.__init__(self)
        C.__init__(self)

    pass
f1=D()
'''
D的構造方法
B的構造方法
A的構造方法
C的構造方法
A的構造方法
'''

print(D.__mro__)
'''
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
'''

#使用super()
class A:
    def __init__(self):
        print('A的構造方法')
class B(A):
    def __init__(self):
        print('B的構造方法')
        super(B,self).__init__()


class C(A):
    def __init__(self):
        print('C的構造方法')
        super(C,self).__init__()


class D(B,C):
    def __init__(self):
        print('D的構造方法')
        super(D,self).__init__()

f1=D() #super()會基於mro列表,往後找
'''
D的構造方法
B的構造方法
C的構造方法
A的構造方法
'''
當你使用super()函式時,Python會在MRO列表上繼續搜尋下一個類。只要每個重定義的方法統一使用super()並只調用它一次,那麼控制流最終會遍歷完整個MRO列表,每個方法也只會被呼叫一次
3.2多型:就是同一事物的不同表現形式
import abc
class jilei(metaclass=abc.ABCMeta): #同一類事物
    @abc.abstractmethod
    def talk(self):
        pass

class People(jilei): #形態之一:人
    def talk(self):
        print('hello')

class Dog(jilei): #形態之二:狗
    def talk(self):
        print('goujiao')

class Pig(jilei): #形態之三:豬
    def talk(self):
        print('zhujiao')

3.3封裝:在python中將資料使用雙下劃線開頭的方式隱藏起來,使外部不可以直接訪問。表面上是限制了我們直接訪問,其實知道了類名和屬性名就可以拼出名字:_類名__屬性,然後就可以訪問了,                  在繼承中,父類如果不想讓子類覆蓋自己的方法,可以將方法定義為私有的。

    封裝在於明確區分內外,使得類實現者可以修改封裝內的東西而不影響外部呼叫者的程式碼;而外部使用用者只知道一個介面(函式),只要介面(函式)名、引數不變,使用者的程式碼永遠無需改變

#類的設計者
class A:
    def __init__(self,length,high):

        self.__length=length
        self.__high=high
    def tell_area(self): #對外提供的介面,隱藏了內部的實現細節
        return self.__length * self.__high


#使用者
r1=A(20,20)
print(r1.tell_area()) #使用者呼叫介面tell_area

 

    待續。。。。