python 面向對象oop

1 oop 對象世界觀  -- oop是目前人類認知最接近實際生活的語言

  • 一切事務皆對象
  • 對象有運動規律和內部狀態
  • 對象之間能夠相互調用

2.面向對象

  • 惟一性:對象具備惟一性,不存在兩個相同的對象,除非他們是同一個對象
  • 能夠分類性 : 對象能夠分類

3.oop 分類

  • 封裝
  • 繼承
  • 多態

具體類:

結構python

  classs 類名:函數

    類體oop

  • 建立對象使用類名(__init__ 函數除第一個參數外的參數列表)
  • 建立對象的時候 實際執行了 __init__函數, __init__ 並不會建立對象,但會初始化對象
  • 當使用對象來調用方法的時候,第一個參數會自動的傳入(默認是self,這個self這四個字母能夠替換成任意字符,但位置必須是第一個)

做用域

  • 類的直接下級做用域 叫作類變量
  • 關聯到實例的變量 叫作實例變量

例子:this

1 class E:
2     NAME = 'E' # 類的直接下級做用域 叫作類變量
3     
4     def __init__(self, name):
5         self.name = name  # 關聯到實例的變量 叫作實例變量
  • 類變量對類和實例均可見
  • 全部實例共享類變量
  • Python 可動態的給對象增減屬性,當給實例的類變量賦值時,至關於動態的給這個實例增長了一個屬性,覆蓋了類變量

 

屬性的查找順序

  • __dict__  :當經過對象動態增長屬性的時候,若是存在此屬性,會覆蓋原屬性,不存在會存放到對象.__dict__中。spa

  • __class__ : 若是經過類名.類屬性方式給類屬性從新賦值,原類屬性會被覆蓋代理

  --------------------------------------------------- 只須要對象.__dict__ 來看其內容能分辨-----------------------------------------------------------------------------  code

類裝飾器一般用於給類增長屬性-- 方法都是類級的對象

類方法/靜態方法

方法的定義都是類級的,可是有的方法使用實例調用,有的方法使用類來調用blog

class I:
    def print(self):
        print('instance method')
    
    @classmethod  # 當一個方法,被classmethod裝飾的時候, 第一個參數會變成類自己, 這樣的方法叫類方法
    def class_print(cls):
        print(id(cls))
        print('class method')
    
    @staticmethod # 當一個方法, 被staticmethod裝飾的時候,不會自動傳遞第一個參數, 這樣的方法叫靜態方法
    def static_print():
        print('static method')
        
    def xxx_print():
        print('this is a function')

實例方法只能由實例調用繼承

類方法:類方法能夠被實例使用,而且被實例使用時,傳入的第一個參數仍是類

訪問控制

 

class Door:
    def __init__(self, number, status):
        self.number = number
        self.__status = status  # 雙下劃線開始, 非雙下劃綫結尾的都是私有的, 在類外部沒法訪問
    
    def open(self): # 方法
        self.__status = 'opening'
        
    def close(self):
        self.__status = 'closed'
    
    def status(self):
        return self.__status
    
    def __set_number(self, number): # 雙下滑先開始, 非雙下劃線結尾的方法也是私有方法
        self.number = number

全部雙下劃線開始,非雙下劃線結尾的成員,都是私有成員

私有成員在類外部沒法訪問

Python的私有成員是經過更名實現的,_類名 + 帶雙下劃綫的屬性 在__dict__ 中會有標識(python中沒有真正的私有成員,但這能夠忽略不計)

部分代碼中 用單下劃線標註的變量能夠理解爲內部變量,不但願在外部繼續調用(其實外部能夠調用),解釋器不不作任何處理

雙下劃線開始,非雙下劃線結尾的方法是私有方法。

若是用 @property  裝飾器會把一個僅有self參數的函數,變成一個屬性, 屬性的值,爲方法的返回值

class Door:
    def __init__(self, status):
        self.__status = status  # 雙下劃線開始, 非雙下劃綫結尾的都是私有的, 在類外部沒法訪問
       
    @property    # property 裝飾器會把一個僅有self參數的函數,變成一個屬性, 屬性的值,爲方法的返回值
    def status(self):
        return self.__status
d = Door('opening')
print(d.status) status 爲 Door 中 status方法

類的繼承

  • 在類名後加括號 括號中是繼承列表, 稱之爲父類或者基類或者超類- python中不建議多繼承
  • 繼承一個明顯的好處就是能夠獲取父類的屬性和方法,深層次繼承會比較亂
  • 凡是公有的都能繼承
  • 凡是私有的都不能繼承
  • 原來是什麼,繼承過來仍是什麼
  • 當子類和父類有同名成員的時候, 子類的成員會覆蓋父類的同名成員
  • super(父類, self).print() # 代理 TYPE 的父類的方法, 而且使用 obj 綁定 第一個參數 指定調用誰的直接父類, 第二個參數指定當調用時,傳遞什麼做爲方法的第一個參數

  • 當父類含有一個帶參數的初始化方法的時候,子類必定須要一個初始化方法,而且在初始化方法中調用父類的初始化方法
    class Base:
        def __init__(self, a, b):
            self.__a = a
            self.__b = b
        
        def sum(self):
            return self.__a + self.__b
    class Sub(Base):
        def __init__(self, a, b, c):
            self.c = c
    #         self.__a = a
    #         self.__b = b
            super().__init__(a, b)
  • super 對象只能獲取類的屬性

相關文章
相關標籤/搜索