1 oop 程式設計 object-oriented programming --->物件導向程式設計
opp 程式設計 procedure oriented programming--->面向過程程式設計
2 物件導向程式設計,區別於面向過程程式設計
-最大核心:有物件,有屬性,有方法
3 類與物件
class people:
pass
p=people()
p.屬性
p.方法()
4 定製物件的獨有特徵
(1)類和物件都有自己的命名空間
(2)物件.屬性--->優先使用自己命名空間的屬性--->自己沒有使用類的
(3)物件.屬性=value---->不會修改掉類命名空間的值--->只改自己的
5 物件屬性查詢屬性
(1)先從物件自己找,找不到去類中找,再找不到報錯
(2)類屬性的更改 類名.屬性=變更 不會影響物件自己的命名空間
6 物件的繫結方法
# 方法和函式的區別?
-方法會自動傳值,方法是繫結給某個物件的
-函式有幾個值就傳幾個值
-注意點:物件來呼叫是方法,類來呼叫是函式
# 類內部定義,沒有被裝飾器修飾的方法,都是物件的繫結方法
7 類和型別
(1)type(物件)---->類
(2)如何去檢視原始碼:typpe(物件)
from xx import 類
8 有物件和沒有物件的區別
以後一般情況盡量使用類來寫
9 模擬王者榮耀對戰遊戲
10 物件導向的繼承
-少些**
-class people(animal):
pass
-多繼承
-新式類
-經典類
-繼承後的屬性查詢順序
-物件---》類---》父類(從左到右)
11 類的派生
-有了繼承關係以後,在子類中新的屬性和方法,稱為派生
-子類重寫父類的方法,功能增加,也叫派生
12 物件導向的組合
-物件中套物件
-物件中的物件其實是乙個引用
13 菱形問題(必須出現菱形,最頂層objct不算)
-新式類:廣度優先
-經典類:深度優先
-繼承關係的mro列表
-以後看原始碼的時候-繼承關係裡面的查詢順序
self.方法(),不要盲目的按照ctrl鍵點,需要從根上往上找
14 super()
-特殊物件----》父類物件(嚴格按照mro列表查詢)
-類名.方法() 指名道姓的使用,不會亂
-super()呼叫方法不需要傳self
-類名來呼叫方法需要傳self
15 多型和多型性
-多型-同一類食物的多種形態
-有乙個父類(animal)
-有一堆子類,繼承父類(people,cat,dog)
-子類例項化得到物件,這就叫多型
-多型性
-不考慮物件具體型別情況下,使用物件
-people,cat,dog
-run(物件)
-鴨子型別
-走路像鴨子,看起來像鴨子,物件就是鴨子
-**體現
-abc模組限制子類必須重寫父類的方法
-拋異常的方式限制子類必須重寫父類的方法
16 類的封裝
-把屬性和方法包裝到類內部
-把屬性或方法隱藏,只讓屬性跟方法在內部使用,只對外暴露簡單介面(方法)
-屬性或方法前加 __ 也會看到只加 _
-外部也可以使用到隱藏屬性和方法 _類名__屬性名
-內部正常使用
17 property
-把方法包裝成資料屬性
-其他使用
class goods:
@property # 相當於@price.getter
def price(self):
print('@property')
@price.setter
def price(self, value):
print('@price.setter')
@price.deleter
def price(self):
print('@price.deleter')
18 繫結方法和非繫結方法
-沒有裝飾器修飾的:繫結給物件,物件來呼叫,自動傳入物件,類來呼叫就是普通函式,有個值傳入幾個值
-用classmethod修飾的:繫結給類,類來呼叫,自動把類傳入,物件也可以來呼叫,把物件轉成類,傳入
-用staticmethod修飾的:不繫結給任何人,誰都可以來呼叫,有幾個值裝飾器
type __new__---->使用staticmethod修飾了---》作者之所以這樣寫的目的
讓我們看到__new__以後,就知道它是個靜態方法,不繫結給任何人
# 補充:
以後只要是python專案,根路徑下都要有乙個requirements.txt,文字檔案
記錄這個專案使用了哪些第三方模組,版本是多少
1 isinstance和issubclass
-isinstance判斷乙個物件是不是乙個類的物件(繼承關係也能判斷)
-issubclass判斷乙個類是不是另乙個類的子類(繼承關係也能判斷)
2 反射
setattr:向物件中設定屬性或方法(向類設定)
getattr:通過物件獲取屬性或方法
delattr:刪除物件中的屬性或方法
hasattr:判斷屬性或方法是否再物件中
# 反射模組
__import__ # 普通反射模組
__import__("lib.text.commons", fromlist=true) # 帶點的反射
# 反射模組二
import importlib
a=importlib.import_module('a')
print(a.setting)
3 . 攔截方法
-__setattr__:物件.屬性=值 觸發它
-__getattr__:物件.屬性 屬性不存在觸發
-__delattr__:del 物件.屬性 觸發它
-__getattribute__ # 它會先於__getattr__執行,如果重寫了它, __getattr__就不會執行
4 item系列
-__setitem__: 物件['key']=value 觸發它執行
-__getitem__: 物件['key'] 觸發它執行
-__delitem__: del 物件['key'] 觸發它執行
5 __format__
-format(物件) ---》觸發類中__format__的執行
-''.format(物件) ---》觸發類中__format__的執行
6 __del__
del 物件 觸發它指向
7 __slots__
-類屬性:
-限制物件屬性只能是__slots__中的
-節省記憶體(屬性比較少,物件很多)
8 __all__
-from xx import * 匯入只會匯入__all__中定義的屬性
9 __doc__
-類的注釋
-類名.__doc__ # 列印出注釋
-它不能繼承
10 __call__
-物件()---->觸發該物件所屬類的 __call__
11 __init__和__new__
-__new__建立乙個空物件
-__init__完成初始化
-new是再init之前執行
-最本質是元類中的__call__內部呼叫了new和init
12 __str__和__repr__
-print(物件) 會觸發 __str__的執行,如果沒有再觸發__repr__的執行
-在命令視窗中,寫物件 觸發__repr__的執行
13 迭代器協議
-寫乙個物件,支援for迴圈來迴圈它
-重寫__iter__和__next__
14 __module__和__class__
-__module__看物件屬於哪個模組
物件.__module__
-__class__看物件屬於哪個類
物件.__class__
15 上下文管理協議
-with 物件 as f: 觸發物件的 __enter__執行,返回什麼,f就是什麼
-脫離了with,就會觸發__exit__,異常處理和資源清理
-__enter__
-__exit__
16 描述符
-新式類,重寫了 __get__,__set__,__delete__,就是描述符
-用來**類屬性
-資料描述符和非資料描述符
-通過描述符限制物件的屬性型別
-類裝飾器(有參)
-類裝飾器+描述符實現限制物件的屬性型別
-property,classmethod,staticmethod底層原理,自定製
17 元類
-類的類,預設是type
-重寫元類,必須繼承type
-class people(metaclass=自己寫的)
-__init__
-__call__
-__new__
-通過元類控制類的建立
-通過元類控制物件的建立
18 單例模式:
-全域性只有乙個物件
-5種方式
物件導向 屬性
資料屬性 configurable 能否通過delete刪除屬性而重新定義屬性,或能否把屬性修改為訪問器屬性。預設為 true。enumerable 能否通過for in迴圈返回屬性。預設為 true。writable 能否修改屬性的值。預設為 true。value 包含這個屬性的資料值。讀取屬性值...
JS物件導向之物件的屬性
1.屬性的設定和獲取通過 操作符或者 區別 操作符取自身的屬性,可以是變數 var o o.name 緣滅 var aaa name console.log o aaa 緣滅ps 一道比較坑的筆試題 var str abc str 1 var test typeof str if test.leng...
物件導向基礎 屬性
談到屬性,不妨先聊聊屬性和字段的區別。屬性 是提供給類的外部呼叫時用的。get表示可讀 set表示可寫 字段 類的內部用於儲存資料用的。先記住一句話 習慣用法,屬性開頭字母大寫,字段開頭字母小寫!using system using system.collections.generic using ...