python-33 面向對象之三:靜態屬性、類方法、靜態方法、接口、抽象類

屬性:java

  公有屬性  (屬於類,每一個類一份)python

  普通屬性  (屬於對象,每一個對象一份)linux

  私有屬性    (屬於對象,跟普通屬性類似,只是不能經過對象直接訪問) c++

方法:(按做用)編程

  構造方法網絡

  析構函數ide

方法:(按類型)函數

  普通方法(類中普通方法,自動傳入self)工具

  私有方法(方法前面加兩個下劃線)post

  靜態方法(類工具包,類和對象都不綁定,都 可調用)

  類方法(綁定具體的類,僅類可調用,自動傳入cls)

  靜態屬性(也是方法,只是假裝成屬性,以調用屬性的方法去調用,即不用加括號)

靜態方法

@staticmethod
靜態方法,又叫類工具包,既不綁定類,也不綁定對象,二者均可調用,

類方法

@classmethod
類方法,僅類可調用,傳入的值也必須是類的公有數據屬性,
就是說類方法只能操做類自己的公有字段

靜態屬性

@property 

靜態屬性:將方法屬性假裝成數據屬性,和數據屬性同樣去調用

# 類的靜態屬性:把函數屬性變成數據屬性,這樣進行了假裝,表面上看是數據屬性,實質是函數屬性,靜態方法語法糖:@property
a='aa'
b='bb'
class Room():
    tag='建築物'  #類的靜態屬性
    def __init__(self,name,long,width):
        self.long=long
        self.width=width
        self.name=name
    @property    #在方法屬性前加上 @property,使該方法屬性變成了類的靜態屬性,調用方法:實例.方法名,做用:假裝成靜態屬性,讓用戶不知道其內部邏輯
    def cal_area(self):
        print('%s房子的面積是%d'%(self.name,self.width*self.long))

    def owner(self):#普通方法
        print('this is %s hours'%self.name)


    #類方法:將方法屬性只跟類綁定,與實例無關,語法糖@classmethod,在類字典中
    @classmethod
    def tell_info(cls):#自動填入cls,即與類綁定
        print('類型--->',cls.tag)

    #類靜態方法:與類和實例都不綁定,它只是名義歸屬類管理,不能使用類變量和實例變量,是類的工具包,語法糖@staticmethod
    @staticmethod
    def test(a,b):   #不自動填入cls和self,代表不和任何綁定,類和實例均可調用
        print('%s 和 %s正在玩耍'%(a,b))
        #print(self.width) 不能使用實例變量
        #print(cls.tag)    也不能使用類變量

    def test_1(name):
        print("name=%s"%name)

r1=Room('xm',1,5)
r2=Room('mf',30,50)
r1.cal_area #變成靜態屬性後, r1.cal_area()變成調用屬性同樣r1.cal_area
r2.cal_area # r2.cal_area()--》r2.cal_area
Room.owner(r1)#通常方法屬性,用類調用時,必需傳入一個實例對象,類型---> 建築物
Room.tell_info()#類方法,用類調用,就不用傳入實例對象了,這樣與實例無任何關係了
Room.test('小紅','小白')#小紅 和 小白正在玩耍
r1.test('小黑','小王')#小黑 和 小王正在玩耍
r2.test(a,b)#aa 和 bb正在玩耍
Room.test_1('cat')#類能夠調用,對象不能夠調用,但通常不這樣用。
r1.test_1('小貓') #TypeError: test_1() takes 1 positional argument but 2 were given,自動傳入-個self參數,but 2 were given
View Code

1、接口

接口:interface,像在java、c++中擁有的類,而在python中,沒有這種接口說法,只有接口類

接口的做用:制定規範、標準

實現方法:僅管python中沒有接口(interface),但能夠經過抽象類來實現接口的功能。

繼承有兩種用途:

一:繼承基類的方法,而且作出本身的改變或者擴展(代碼重用)  

二:聲明某個子類兼容於某基類,定義一個接口類Interface,接口類中定義了一些接口名(就是函數名)且並未實現接口的功能,子類繼承接口類,而且實現接口中的功能.

實踐中,繼承的第一種含義意義並不很大,甚至經常是有害的。由於它使得子類與基類出現強耦合。

繼承的第二種含義很是重要。它又叫「接口繼承」。
接口繼承實質上是要求「作出一個良好的抽象,這個抽象規定了一個兼容接口,使得外部調用者無需關心具體細節,可一視同仁的處理實現了特定接口的全部對象」——這在程序設計上,叫作歸一化。

1.作出良好的抽象類,2.規定兼容接口 3.調用者能夠無需關心具體實現細節,能夠一視同仁處理實現特定接口的全部對象。

歸一化使得高層的外部使用者能夠不加區分的處理全部接口兼容的對象集合——就好象linux的泛文件概念同樣,全部東西均可以當文件處理,沒必要關心它是內存、磁盤、網絡仍是屏幕(固然,對底層設計者,固然也能夠區分出「字符設備」和「塊設備」,而後作出針對性的設計:細緻到什麼程度,視需求而定)。

2、抽象類

什麼是抽象類

    與java同樣,python也有抽象類的概念可是一樣須要藉助模塊實現,抽象類是一個特殊的類,它的特殊之處在於只能被繼承,不能被實例化

爲何要有抽象類

    若是說類是從一堆對象中抽取相同的內容而來的,那麼抽象類是從一堆中抽取相同的內容而來的,內容包括數據屬性和函數屬性。

  好比咱們有香蕉的類,有蘋果的類,有桃子的類,從這些類抽取相同的內容就是水果這個抽象的類,你吃水果時,要麼是吃一個具體的香蕉,要麼是吃一個具體的桃子。。。。。。你永遠沒法吃到一個叫作水果的東西。

    從設計角度去看,若是類是從現實對象抽象而來的,那麼抽象類就是基於類抽象而來的。

  從實現角度來看,抽象類與普通類的不一樣之處在於:抽象類中有抽象方法,該類不能被實例化,只能被繼承,且子類必須實現抽象方法。這一點與接口有點相似,但實際上是不一樣的,即將揭曉答案

在python中實現抽象類

#1.接口:接口就是一個函數,在基類中利用裝飾器方法,將類的方法屬性實義爲一個接口函數
#接口基類:是一個抽象類,只定義方法屬性名,不去具體實現功能,它起到歸一和制定標準的做用,
# 接口類的具體功能在其繼承的子類中實現,

import abc #利用abc模塊實現抽象類
class All_file(metaclass=abc.ABCMeta): #接口:抽象方法類,只定義函數名,不去具體實現功能
    @abc.abstractmethod                #利用裝飾器,定義抽象方法
    def read(self):
        '子類必須定義讀功能'
        pass

    @abc.abstractmethod
    def write(self):
        '子類必須定義寫功能'
        pass

# class Txt(All_file):
#     pass
# t1=Txt() #報錯,子類沒有定義抽象方法


class Disk(All_file):#接口繼承子類,必需顯示繼承全部方法,並根據須要實現其具體功能。
    def read(self):
        print("硬盤讀")
    def write(self):
        pass

class Memro(All_file):
    def read(self):
       pass
    def write(self):
        print("內存寫")

d=Disk()
m=Memro()
#這樣你們都是被歸一化了,也就是一切皆文件的思想
d.read()
d.write()
m.read()
m.write()

3、抽象類和接口類

抽象類的本質仍是類,指的是一組類的類似性,包括數據屬性(如all_type)和函數屬性(如read、write),而接口只強調函數屬性的類似性。

抽象類是一個介於類和接口之間的一個概念,同時具有類和接口的部分特性,能夠用來實現歸一化設計

在python中,並無接口類這種東西,即使不經過專門的模塊定義接口,咱們也應該有一些基本的概念。

1. 多繼承問題

在繼承抽象類的過程當中,咱們應該儘可能避免多繼承;
而在繼承接口的時候,咱們反而鼓勵你來多繼承接口

接口隔離原則:

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

2. 方法的實現

在抽象類中,咱們能夠對一些抽象方法作出基礎實現;
而在接口類中,任何方法都只是一種規範,具體的功能須要子類實現

多繼承遍歷順序:

  • 經典類:深度優先
  • 新式類:廣度優先

繼承的做用

  • 減小代碼的重用
  • 提升代碼可讀性
  • 規範編程模式
相關文章
相關標籤/搜索