【面向對象】

  • 類 class

  • 抽象概念

  • 是屬性與方法的集合

  • 對象/實例 instance/object

  • 類的具體實現/實例化

  • 屬性

  • 對象狀態的抽象,用數據結構描述

  • 操作/方法

  • 對象行爲的抽象,用操作名和實現該操作的方法來描述

  • 一切皆對象

  • 對象是數據和操作的封裝

  • 對象是獨立的,但是對象之間可以互相作用

  • 目前OOP是最接近人類認知的編程範式

面向對象的OOP三要素

封裝

  • 組裝:將數據和操作組裝到一起

  • 隱藏數據:對外只暴露一些接口,通過接口訪問對象

繼承

  • 多複用

  • 少修改

  • OCP開閉原則 對擴展開放,對修改關閉

多態

  • 動態綁定:面向對象最靈活的地方

Python的類

  • 類名必須用大駝峯命名

  • 必須使用class 的關鍵字

  • 類定義完成產生的對象,綁定到了標識符ClassName上

類對象及類屬性

  • 類對象

  • 類定義會生成一個類對象

  • 類屬性

    • 類定義中的變量和類中定義的方法都是類屬性

  • 類變量,

  • 方法對象method 一般至少有一個參數self(第一個參數可以是self 也可以是其他值但是規定使用self

  • self指代當前實例本身,類似Java的this

實例化

  • 在類對象名稱後面加上一個括號,即實例化

  • 一般情況下類可以生成多個實例

  • 每次實例化獲得的實例都是不同的,即使使用同樣的參數實例化

  • Python類實例化會先自動調用類或其超類內部的new方法,再調用init方法

  • 如果類沒有定義init,會隱式調用

  • init作用:對實例進行初始化,類似Java的構造器

init方法不能有返回值,只能是None

實例對象(instance)

  • 類實例化後一定獲得一個對象,就是實例對象。

  • self.name name是保存在了實例上,並不是類上

  • 說明self  就一個調用者,就是c對應的對像

實例變量和類變量

  • 實例變量是每一個實例自己的變量,是自己獨有的;類變量是類的變量,是類的所有實例共享的屬性和方法

特殊屬性

  • __name__ 對象名

  • __class__ 對象的類型

  • __dict__ 對象的屬性的字典

  • __qualname__ 類的限定名

總結:

是類的,也是這個類所有的實例的,其實列都可以訪問到的;是實例的,就是這個實例自己的,通過類訪問不到。

Python中每一種對象都擁有不同的屬性。函數、類都是對象,類的實例也是對象

實例屬性的查找順序

  • 實例使用.來訪問屬性,會先找自己的dict,如果沒有,通過屬性class找到自己的類,再去類的dict中找

一般來說。類變量使用全大寫命名

裝飾類

def add_name(name):    
def wrapper(value):
value.NAME=name        
return value    
return wrapper

@add_name('a') # A=add_name(A)('a')class A:
AGE=8

裝飾類就是爲了類添加一個屬性,通過標識符指向這個類的對象。

類方法和靜態方法

類方法

  • 在類定義中,使用@classmethod裝飾器修飾方法

  • 必須至少有一個參數,且第一個參數留給cls,cls指代調用者即類對象自身

  • cls這個標識符可以是任意合法名稱,但是爲了易讀,不要修改

  • 通過cls可以直接操作類的屬性

  • 類似C++、Java中的靜態方法

靜態方法

  • 在類定義中,使用@staticmethod裝飾器修飾的方法

  • 調用時不會隱式傳入參數

!靜態方法;只是表明這個方法屬於這個名詞空間,函數歸在一起,方便組織管理

調用方法

  • 類幾乎都可以調用素有內部定義的方法,但是調用普通方法會出錯的,原因是第一參數必須是類的實例,實例也幾乎是調用的所有的方法,普通函數調用喲辦不會這麼出現,因爲不能這麼出現,因爲不與允許這麼定義

  • 類除了普通方法都可以調用,普通方法需要對象的實例作爲第一參數

  • 實例可以調用所有類中定義的方法,普通方法傳入實例自身,靜態方法和類方法需要找到實例的類

訪問控制

私有屬性(private)

  • 使用雙下劃線開頭的屬性名

本質

  • 類定義的時候,如果聲明一個實例變量的時候,使用雙下劃線,Python解釋器會將其改名爲_類名__變量名,所以用原來的名字訪問不到了。

  • 用此變量名仍可以訪問私有變量

保護變量

  • 變量名前使用一個下劃線

  • 只是開發者共同約定

私有變量

  • 參照私有變量、保護變量

屬性裝飾器

property裝飾器

  • 後面跟的函數名就是屬性名,其本身就是getter 必須存在

setter裝飾器

  • 接受self,與將要賦值的值。

deleter裝飾器

  • 控制是否刪除屬性,很少用

property裝飾器必須在前

方法一;

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

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        self.__age = age

    @age.deleter
    def age(self):
        print('del')

方法二:

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

    def getage(self):
        return self.__age

    def setage(self, age):
        self.__age = age

    def delage(self):
        print('del')
        

    age = property(getage, setage, delage, 'age property')

方法三:

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

    age = property(lambda self: self.__age)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章