類 classpython
抽象概念編程
是屬性與方法的集合數據結構
對象/實例 instance/objectapp
類的具體實現/實例化ide
屬性函數
對象狀態的抽象,用數據結構描述this
操做/方法spa
對象行爲的抽象,用操做名和實現該操做的方法來描述3d
一切皆對象對象
對象是數據和操做的封裝
對象是獨立的,可是對象之間能夠互相做用
目前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)