1. 程式人生 > >面向對象三大特性

面向對象三大特性

組件 python3 處理 提高 方法 直接 使用實例 方法名 nbsp

面向對象三大特性

一、繼承

1、定義:

繼承是一種創建新類的方式,在python中新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類

2、繼承的使用場景:什麽是什麽

3、查看父類的雙下方法:Foo.__bases__

4、種類:

①單繼承

  • 父類中沒有的屬性在子類中出現叫做派生屬性
  • 父類中沒有的方法在子類中出現叫做派生方法
  • 只要是子類的對象調用,子類中有的名字一定用子類的,子類中沒有才找父類的,如果父類也沒有報錯
  • 如果父類、子類都有則用子類的
    • 如果還想用父類的,單獨調用父類的:
      1、父類名.方法名 需要自己傳self參數
      2、super().方法名 不需要自己傳self
  • 正常的代碼中單繼承 ===> 減少了代碼的重復
  • 繼承表達的是一種子類是父類的關系

②多繼承

  • 在python2中
    • 新式類:繼承object類的才是新式類——>遵循廣度優先原則
      可以用Foo.\_\_mro\_\_方法查看繼承順序,mro方法只在新式類中存在
    • 經典類:直接創建一個類默認是經典類——>遵循深度優先原則
  • 在python3中
    • 所有在python3中創建的類都是新式類——>遵循廣度優先原則
    • 可以用Foo.__mro__方法查看繼承順序,mro方法只在新式類中存在

5、super()關鍵字

①super()只在python3中存在

②super的本質 :不是單純找父類而是根據調用者的節點位置的廣度優先順序來的

二、抽象類&接口類、多態

抽象類與接口類

1、前言

①所謂的接口類是借了其他面向對象語言(Java)的設計模式概念

②在Java中抽象類與接口類的特性

  • 接口類interface支持多繼承,接口類中的所有的方法都必須不能實現—Java
  • 抽象類不支持多繼承,抽象類中方法可以有一些代碼的實現—Java

③接口隔離原則:

  • 使用多個專門的接口,而不使用單一的總接口,即客戶端不應該依賴那些不需要的接口。

2、抽象類

①python原生支持

②抽象類是一個介於類和接口直接的一個概念,同時具備類和接口的部分特性,可以用來實現歸一化設計

③python的抽象類保持了java的特性,使用抽象類的時候盡量單繼承

④python中的抽象類需要借助模塊來實現,抽象類是一個特殊的類,只能被繼承,不能被實例化

⑤為了幫助理解,我們可以認為抽象類就是從一堆類中抽取相同的內容而來的,正如類是從一堆對象中抽取相同的內容而來的相同

⑥舉例:

 1 from abc import abstractclassmethod,ABCMeta
 2 class Payment(metaclass=ABCMeta):
 3     @abstractclassmethod
 4     def pay(self):
 5         print(支付ing....)
 6 
 7 class Wechatpay(Payment):
 8     def pay(self):
 9         print(微信支付ing...)
10 
11 class Alipay(Payment):
12     def pay(self):
13         print(阿裏支付ing...)
14 
15 class Applepay(Payment):
16     def pay(self):
17         print(蘋果支付ing...)
18 
19 wechat = Wechatpay()
20 ali = Alipay()
21 apple = Applepay()

3、接口類

①python原生不支持

②python的抽象類保持了java的特性,使用接口類的時候鼓勵多繼承

多態與多態性

1、前言

①定義:多態指的是一類事物有多種形態

②python語言天生自帶多態的屬性,所以該概念也是類比其他面向對象語言(Java)而言而提及的,因為類似Java等其他面向對象的強類型語言中如果參數是對象的話前面的對象類型指代就是有問題,所以會用對象的父類來代替,這樣表現出來的就是父類的子類都可以作為參數,而調用不同的子類就會表現出不同的結果,也就是多態的表現;但是針對python語言而言是動態強類型語言所以不會發生該問題,即天生即解決了多態的問題

2、多態動態綁定(在繼承的背景下使用時,也稱為多態性)

①多態性是指在不考慮實例類型的情況下使用實例

3、鴨子類型

①出處:鴨子類型的名稱來源於西方諺語:一只鳥長得像鴨子,叫聲像鴨子,走路也像鴨子,那它就是鴨子!

②原則:如果想編寫現有對象的自定義版本,可以繼承該對象也可以創建一個外觀和行為像,但與它無任何關系的全新對象,後者通常用於保存程序組件的松耦合度。

③優缺點:

  • 優點:低耦合,每個相似的類之間都沒有影響
  • 缺點:對自覺性要求較高

④應用實例:list、tuple該兩個類極為相似,但卻沒有用繼承來實現,它們互為鴨子類型

封裝

1、定義:隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。

2、作用:

①將變化隔離

②便於使用

③提高復用性

④提高安全性

3、封裝原則:

①將不需要對外提供的內容都隱藏起來

②把屬性都隱藏,提供公共方法對其訪問

4、私有變量和私有方法

①適用場景

  • 在python中用雙下劃線開頭的方式將屬性隱藏起來,即設置成私有的
  • 在繼承中,父類如果不想讓子類覆蓋自己的方法,可以將方法定義為私有的

②實例:

class Foo:
    __VAR = 100
    def __init__(self,name,password):
        self.name = name
        self.__password = password
    def get_password(self):
        return self.__password

foo = Foo(python,123)
foo.get_password()

③私有化變形的特點

  • 類中定義的__x只能在內部使用,如self.__x,引用的就是變形的結果。
  • 這種變形其實正是針對外部的變形,在外部是無法通過__x這個名字訪問到的。
  • 在子類定義的__x不會覆蓋在父類定義的__x,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。

④私有化變形的註意點:

  • 這種機制也並沒有真正意義上限制我們從外部直接訪問屬性,知道了類名和屬性名就可以拼出名字:_類名__屬性,然後就可以訪問了,如a._A__N
  • 變形的過程只在類的內部生效,在定義後的賦值操作,不會變形

5、私有化屬性、方法的適用場景

①禁止在類的外部調用

②保護屬性避免被隨意改變

③保護屬性不想被子類繼承

6、property屬性

①原理:property是一種特殊的屬性,訪問它時會執行一段功能(函數)然後返回值

②作用:property屬性會將原本是類中的方法改變成類似於屬性調用的形式,用戶可以直接按照屬性的方式進行調用,似的某些需要進行計算或邏輯處理的類屬性調用方式更加合理,這種特性的使用方式遵循了統一訪問的原則

③舉例:

from math import pi

class Circle:
    def __init__(self,radius):
        self.radus = radius

    @property
    def area(self):
        return self.radus**2*pi

    @property
    def perimeter(self):
        return self.radus*2*pi

c = Circle(5)
print(c.area)
print(c.perimeter)

>>> 78.53981633974483
>>> 31.41592653589793
python並沒有在語法上把它們三個內建到自己的class機制中,在C++裏一般會將所有的所有的數據都設置為私有的,然後提供set和get方法(接口)去設置和獲取,在python中通過property方法可以實現,一個靜態屬性property本質就是實現了get,set,delete三種方法
 1 class Foo:
 2     @property
 3     def AAA(self):
 4         print(get的時候運行我啊)
 5 
 6     @AAA.setter
 7     def AAA(self,value):
 8         print(set的時候運行我啊)
 9 
10     @AAA.deleter
11     def AAA(self):
12         print(delete的時候運行我啊)
13 
14 #只有在屬性AAA定義property後才能定義AAA.setter,AAA.deleter
15 f1=Foo()
16 f1.AAA
17 f1.AAA=aaa
18 del f1.AAA

④註意事項:

  • 被property修飾的方法不能有參數

7、classmethod

①定義:類方法,即不需要進行實例化,用類名就可以直接調用的方法,語法:類名.方法名()

②適用場景:

  • 當這個方法的操作只涉及靜態屬性的時候 就應該使用classmethod來裝飾這個方法

③舉例

class Classmethod_Demo():
role = dog

    @classmethod
    def func(cls):
        print(cls.role)

Classmethod_Demo.func()

④註意:

  • 類方法有一個默認參數cls,代表這個類

8、staticmethod

①定義:靜態方法,即

②適用場景:

  • 如果一個函數既和對象沒有關系也和類沒有關系,那麽就用staticmethod將這個函數變成一個靜態方法

③舉例

class Staticmethod_Demo():
role = dog

    @staticmethod
    def func():
        print("當普通方法用")

Staticmethod_Demo.func() 

④註意

  • 靜態方法沒有默認的參數,就象函數一樣

面向對象三大特性