Python第七周 學習筆記(2)
阿新 • • 發佈:2018-05-05
學習筆記面向對象
-
類 class
- 抽象概念
- 是屬性與方法的集合
-
對象/實例 instance/object
- 類的具體實現/實例化
- 屬性
- 對象狀態的抽象,用數據結構描述
-
操作/方法
- 對象行為的抽象,用操作名和實現該操作的方法來描述
- 一切皆對象
- 對象是數據和操作的封裝
- 對象是獨立的,但是對象之間可以互相作用
- 目前OOP是最接近人類認知的編程範式
OOP三要素
封裝
- 組裝:將數據和操作組裝到一起
- 隱藏數據:對外只暴露一些接口,通過接口訪問對象
繼承
- 復用
- 少修改
- OCP開閉原則 對擴展開放,對修改關閉
多態
- 動態綁定
Python的類
- 類名必須用大駝峰命名
類對象及類屬性
- 類對象
- 類定義會生成一個類對象
-
類屬性
- 類定義中的變量和類中定義的方法都是類屬性
- 方法對象method 一般至少有一個參數self
- self指代當前實例本身,類似Java的this
實例化
- 在類對象名稱後面加上一個括號,即實例化
- 一般情況下類可以生成多個實例
- 每次實例化獲得的實例都是不同的,即使使用同樣的參數實例化
- Python類實例化會先自動調用類或其超類內部的new方法,再調用init方法
- 如果類沒有定義init,會隱式調用
- init作用:對實例進行初始化,類似Java的構造器
init方法不能有返回值,只能是None
實例對象
- self.name name是保存在了實例上,並不是類上
實例變量和類變量
- 實例變量是每一個實例自己的變量,是自己獨有的;類變量是類的變量,是類的所有實例共享的屬性和方法
特殊屬性
- 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裝飾器修飾的方法
- 調用時不會隱式傳入參數
調用方法
- 類除了普通方法都可以調用,普通方法需要對象的實例作為第一參數
- 實例可以調用所有類中定義的方法,普通方法傳入實例自身,靜態方法和類方法需要找到實例的類
訪問控制
私有屬性
- 使用雙下劃線開頭的屬性名
本質
- 類定義的時候,如果聲明一個實例變量的時候,使用雙下劃線,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)
Python第七周 學習筆記(2)