Please enable JavaScript.
Coggle requires JavaScript to display documents.
物件導向 (類別class (內建函式 (getattr() 存取物件的屬性, hasattr() 檢查某屬性是否存在, setattr()…
物件導向
類別class
包含:
實體instance (或物件object)
方法method
屬性attribute(物件變數)
python所有的類別(class)與其成員都是public
子類別能和父類別的方法同名,也能覆寫父類別的方法
定義類別class ClassName():
()內表示繼承的類別
class內容使用pass表示啥都不做
每個類別皆可實體化多個物件
經由繼承擴充類別的屬性
運算子重載(overload)
定義方法:
只能定義於class內部
只有產生實體(物件)才會被呼叫
定義方法的第一個參數必須是自己(self),self類似其它語言的this,指向物件自己本身
方法中的第一個引數self:
定義類別時所以的方法都必須宣告它
當物件呼叫方法時,Python直譯器會將它傳遞
使用於方法的self引數,會繫結所指向的實體
物件屬性除了利用
init
()外,還能在產生物件後動態設定,只是動態設定的只有該物件自己能用
Python將建構(
new
())與初始化(
init
())物件分兩步,其它語言一步完成(建構函式Constructor)
new
()是靜態方法
使用
init
()方法的第一個參數必須是self
內建函式
getattr() 存取物件的屬性
hasattr() 檢查某屬性是否存在
setattr() 設定屬性,若不存在建立新的
delattr() 刪除屬性
定義於
init
()方法內為物件變數,在此之外就屬於類別變數,為所有物件共享
處理物件的特殊方法
如同
init
,定義類別時可重載overload
del
() 我測試沒有耶
str
()
repr
()
format
()
hash
()
getattr
() 我測試沒有耶
setattr
()
delattr
()
getattribute
()
dir
()
class
()
類別屬性(唯讀)
doc
name
我測試沒有耶
module
dict
bases
我測試沒有耶
方法種類
實例方法
需要把第一个參數指定为 self。意思就是要先產生實例物件才能呼叫此方法
self 並不是關鍵字,可以用其它名字替代
python 沒有 public / protected / private 這樣的訪問控制,如果你非要表示「私有」,習慣是加雙下劃線字首
與 C++ 不同的是,「成員變數」必須要加 self. 字首,否則就變成類的屬性(相當於 C++ 靜態成員),而不是物件的屬性了
類別方法
不是绑定到实例對象上,而是绑定在類對象上的方法,它的第一个參數cls是这个類本身(记住:類也是對象),不過要加@ classmethod。皆為整個類別的物件所共享
靜態方法
不用傳self,也就是不用實例化一個物件才能調用該方法,不過要加@ staticmethod。盡量以類別來呼叫此方法。皆為整個類別的物件所共享
重載運算子
裝飾器
call
()方法
繼承
子類別會擁有父類別所有的屬性及方法,並還能修改它(override)。當然也能夠定義自己的屬性及類別
若子類別沒複寫父類別的方法,則呼叫時會使用父類別定義的方法
方法甚至可以後續新增,而不用一開始就寫在class裡,動態語言一般都是這麼靈活,Python 也不例外
Python 官方教程「9. Classes」第一句就是: Compared with other programming languages, Python’s class mechanism adds classes with a minimum of new syntax and semantics. Python 以最少的新的語法和語義實現了類機制,這一點確實讓人驚歎,但是也讓 C++ / Java 程式設計師感到頗為不適
override其實只是把相同的屬性名繫結到了不同的函式物件。可見 Python 和其他語言相比是沒有真正的覆寫(override)的概念
單一繼承
只繼承一個類別
多重繼承
繼承多個類別
super()
子類別呼叫父類別的方法:super().方法
bases
記錄所繼承的父類別或動態修改
封裝(資料抽象化)
抽象類別
需匯入abc模組的ABCMeta class來定義抽象類別並用@ absractmethod裝飾抽象方法
抽象類別無法產生物件
Python中,物件是類別的實體,而類別是type的實體
多形(動態繫結)
好像和繼承抽象類別有點關係,看不懂在說啥
我自己學習遇到的
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。