1>元類的概念
1.1> 知識儲備只回顧exec方法,看一下它的三個引數
引數1:object是乙個字串的語句或者乙個編譯過的語句的物件名稱;
引數2:全域性作用域(字典形式),globals 是個 dict 物件,用來指定**執行時可以使用的全域性變數以及收集**
執行後的全域性變數,如果不指定預設就使用globals();
執行後的區域性變數,如果不指定預設就使用locals()。
例子
1.2> 說一說何為「python的一切皆物件」,物件可以怎麼用
1、都可以被引用,x=obj
2、都可以當作函式的引數傳入
3、都可以當作函式的返回值
4、都可以當作容器類的元素,l=[func,time,obj,1]
那麼,站在類的角度(比如就手動用 class定義乙個類),類也滿足上面的4點,是否類 也是乙個物件?例子如下:
此時的 type就是 元類。所有以 class定義的類都是以type為模板建立出來的,他們都是type例項化的物件
所以,元類其實就是類的類,類的模板,class的元類就是type。
type是python的乙個內建元類,用來直接控制生成類
2>建立類的兩種方式
2.1>用class定義乙個類,如 class a():pass,這就定義了乙個類a
2.2> 是手動模擬class建立類的過程:將建立類的步驟拆分開,手動去建立
建立之前,
先看下類的組成:類名(毫無疑問,這個肯定要有),繼承的父類(就算不寫也會預設繼承object,
所以這項一定有),
類的實體----也就是類的命名空間,定義類的時候,類裡面的所有屬性都會以字典形式存放
在乙個區域性的名稱
空間裡面,可以用
__dict__檢視這些屬性。
2.2.1>所以乙個類應該就是由這麼三部分組成,基於之前提到的exec方法,我們搞定 類的實體,也就是想辦法
模擬產生乙個
類的實體。
exec去執行類體的**(exec產生命名空間的過程與真正的class過程類似,只是後者會將__開頭的屬性變形),
生成類的區域性命名空間,即填充字典。
2.2.2>呼叫元類type(或者自定義的元類),來產生類a
3>自定義元類來控制類的行為
乙個類沒有宣告自己的元類,預設他的元類就是type,除了使用元類type,使用者也可以通過繼承type來自定義元類
從需求開始:比如我想在建立類的時候,指定類名的首字母必須大寫,且必須寫注釋,否則建立類的時候就報錯。
既然是要規範類行為,那麼就只能去改 建立類的時候他繼承的模板了,對吧
恩, 那就建立乙個元類,建立之前,再回憶下之前通過元類例項化類的時候需要的引數
例如,假設我定義好了元類 myclass,那麼 建立類就是 a = myclass('a', (object, ), class_dic),有三個引數哈
所以,很明顯,myclass就該有三個引數:類名,基類,命名空間, 具體如下
有三個引數,繼承至type的引數,並且自定義了規則,這樣便實現了通過元類來控制類的行為
物件導向C (8)友元函式和友元類
c 提供了一種允許外部類和外部函式訪問類的私有成員和保護成員的輔助方法,即將它們宣告為乙個給定類的友元,使得其具有類成員函式的訪問許可權。但友元本身不是類的成員 在乙個類中,可以利用關鍵字friend將別的模組宣告為它的友元,這樣,該類中本來隱藏的資訊就可以被友元函式訪問。友元函式 友元是一般函式或...
python 物件導向單例元類
通過類方法來實現單例,這樣我在執行乙個函式中建立物件,但是呼叫多次只是乙個例項。class person classmethod defsingle instancee cls,args,kwargs if notgetattr person,instance cls.instance person...
8 物件導向
物件導向是一種程式設計思想,是對現實世界中的事物進行抽象的方式。應用到 程式設計設計中,是一種建立現實世界事物模型的方式。面向過程關注的是完成工作的步驟,物件導向關注的是誰能完成工作。物件導向是在完成工作的時候關注哪些個體能夠完成對應的工作,找到對應的個體即可完成對應任務。類是一系列事物的統稱,同類...