#------面向對象------#
(1)何時用面向對象
----答:1.代碼量大,功能多。2.處理比較複雜角色之間的關係
#------建立一個對象------#
類名() 實例化
__new__()創造了一個對象的空間,還能夠作一些簡單的初始化。
#------建立一個類-------#
class Leiming 語法級別,Python解釋器讀到就會建立一個類
type 是全部類的元類,object 是全部類的父類
類也是被建立出來的,type 建立的,咱們能夠指定元類 metaclass,默認是type
class A(metaclass = type):pass
type(類名) = type ,那麼type就是這個類的元類。
from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta):pass
上面這個抽象類的元類就是abc.ABCMeta
#---------類---------#
#---------對象---------#
類創造對象的過程就是實例化的過程:構造函數 __new__() 初始化函數 __init__()
能夠經過指針(引用)找到類的空間中的內容
對象自己內部也存儲了一些屬於對象的屬性
#---------組合------———#
一個類的對象做爲另外一個類對象的屬性
#--------繼承---------#
經典類:python2中默認類,若是繼承object就是新式類
新式類:python3的類都爲新式類,沒有經典類
單繼承和多繼承
#---單繼承---#
---若是子類的對象調用某個方法
------若是子類有:調用子類
---------子類有但想調用父類的:
------------super().方法名
------------類名.方法名
---若是子類沒有找父類:
---一層一層往上找
#注:在任何類中調用的方法,都要本身分辨一下,這是誰的對象。
#---多繼承-----#
新式類
----繼承方法廣度優先-C3算法,mro()能夠產看繼承順序
----python3默認繼承object,python2須要主動繼承
----使用 super()方法,python3不須要傳self和子類名,可是python2必須傳
經典類
----繼承方式深度優先,沒有 mro()方法
----python2不繼承object類,默認是經典類
----使用 super()方法,python3不須要傳self和子類名,可是python2必須傳
#---抽象類,接口類----#
#---多態,鴨子類型----#
#----封裝,私有的----#
--廣義的封裝:把方法和屬性都封裝在一個類中,定義一個規矩來描述一類事物
--狹義的封裝:私有化只能在類的內部訪問
----__靜態變量,私有方法,私有對象屬性,私有類方法,私有靜態方法
----在內存中的存儲_類名__名字
----在子類中不能夠訪問父類的私有變量
----私有:不能在類外部使用也不能被繼承
#---@property----#
裝飾器函數,幫助咱們將類中的方法假裝成爲屬性
調用方法時不用加 () 返回值找出
@方法名.setter 裝飾器 修改被property裝飾的屬性時,調用這個方法,有兩個參數,self 被修改的值
@方法名.deleter 裝飾器 當要刪除被property裝飾的屬性時,會調用這個方法。
何時回用到呢?
答:當使用一個屬性,可是對這個屬性有約束的時候。
#----classmethod 類方法裝飾器-----#
推薦使用類名調用,默認傳類名爲第一個參數
不用對象命名空間的內容,而用到了類命名空間中的變量(靜態屬性),或者類方法,或者靜態方法
#----staticmethod 靜態方法裝飾器----#
若是一個類裏面的方法,即不須要用到self中的資源,也不用到cls中的資源
至關於一個普通函數
可是因爲某種緣由,還要把這個方法放在類中,這個時候就將這個方法變爲靜態方法,那麼這裏的某種緣由是什麼呢?
----答:1,徹底想用面向對象編程,全部的函數都必須寫在類裏面
-------2,某個功能確確實實是這個類的方法,可是確確實實沒有用到和這個類有關係的資源
#--------反射-------#
以某個指定的命名空間中,用字符串數據類型的變量名來獲取變量的值
應用場景:
1,類名,反射 靜態屬性,類方法,靜態方法
2,對象,反射 對象屬性,方法
3,模塊, 反射 模塊中的方法
4.本身模塊中
1.getattr
用法:getattr(object, name[,default]) -> value
返回object中name字符串對應的方法和屬性,不存在返回默認值default。
若是沒有傳default,那麼找不到就會報錯
2.hasattr
用法:hasattr(object, name) #判斷object中有沒有一個name字符串對應的方法和屬性
#若是存在返回True,不存在返回False,通常與getattr配合使用
3.setattr
用法:setattr(object, name, value)
修改object中name字符串對應的屬性name變爲value
4.delattr
用法:delattr(object, name)
刪除object中name字符串對應的屬性和方法
用反射的必要條件:變量名只能拿到一個字符串 1,從文件中拿 2,交互拿input/網絡傳輸
#------內置方法、魔法方法,雙下方法-----#
__名字__不是被直接調用的
間接調用,內置方法、面向對象中特殊語法,Python提供的語法糖