自定義建立元類

2022-06-19 11:39:13 字數 2810 閱讀 1357

#

coding=utf-8

class

upperattrmetaclass(type):

#__new__ 是在__init__之前被呼叫的特殊方法

#__new__是用來建立物件並返回之的方法

#而__init__只是用來將傳入的引數初始化給物件

#__new__能夠控制物件的建立

#這裡,建立的物件是類,自定義這個類,我們這裡改寫__new__

#如果你希望的話,你也可以在__init__中做些事情

#可改寫__call__特殊方法

def__new__

(cls, future_class_name, future_class_parents, future_class_attr):

#cls、類名、父類、需要修改的字典

#遍歷屬性字典,把不是__開頭的屬性名字變為大寫

newattr ={}

for key,value in

future_class_attr.items():

ifnot key.startswith("__"

): newattr[key.upper()] =value

#使字典的鍵值大寫

#方法1:通過'type'來做類物件的建立

#return type(future_class_name, future_class_parents, newattr)

#type 類名、父類名、字典(剛剛進行修改的字典)

#方法2:復用type.__new__方法

#這就是基本的oop程式設計,沒什麼魔法

#return type.__new__(cls, future_class_name, future_class_parents, newattr)

#類名、父類名、字典(剛剛進行修改的字典)

#方法3:使用super方法

return super(upperattrmetaclass,cls).__new__

(cls, future_class_name, future_class_parents, newattr)

#python3的用法

class foo(object, metaclass =upperattrmetaclass):

#metaclass執行類的時候,根據metaclass的屬性。修改類中的屬性

bar = '

bip'

#hasattr 檢視類中是否具有該屬性

print(hasattr(foo, '

bar'))#

輸出: false

print(hasattr(foo, '

bar'))#

輸出:true

f =foo()

#進行構造,產生 f 物件

print

(f.bar)

#輸出:'bip',metaclass修改了foo類

class

upperattrmetaclass(type):

#__new__ 是在__init__之前被呼叫的特殊方法

#__new__是用來建立物件並返回之的方法

#而__init__只是用來將傳入的引數初始化給物件

#你很少用到__new__,除非你希望能夠控制物件的建立

#這裡,建立的物件是類,我們希望能夠自定義它,所以我們這裡改寫__new__

#如果你希望的話,你也可以在__init__中做些事情

#還有一些高階的用法會涉及到改寫__call__特殊方法,但是我們這裡不用

def__new__

(cls, future_class_name, future_class_parents, future_class_attr):

#遍歷屬性字典,把不是__開頭的屬性名字變為大寫

newattr ={}

for name,value in

future_class_attr.items():

ifnot name.startswith("__"

): newattr[name.upper()] =value

#方法1:通過'type'來做類物件的建立

return

type(future_class_name, future_class_parents, newattr)

#方法2:復用type.__new__方法

#return type.__new__(cls, future_class_name, future_class_parents, newattr)

#return type.__new__(cls,future_class_name,future_class_parents,newattr)

#方法3:使用super方法

return super(upperattrmetaclass, cls).__new__

(cls, future_class_name, future_class_parents, newattr)

#python3的用法

class foo(object, metaclass =upperattrmetaclass):

bar = '

bip'

print(hasattr(foo, '

bar'

))print(hasattr(foo, '

bar'

))f =foo()

print(f.bar)

2020-05-08

建立自定義異常類

建立自定義的異常類需要繼承自exception類,並提供含有乙個string型別形參的構造方法,該形參就是一場的描述資訊,可以通過getmessage 方法獲得。例如 public class newexception extends exception try catch在main裡頭用哈,具體的...

自定義元類控制類的建立

chinese每次建立由原來的type改為mymeta,因此可以在mymeta內對類進行一些特殊定製 示例一 類名的大小寫強控 class mymeta type def init self,class name,class bases,class dic if not class name.ist...

建立自定義類的物件陣列

j a語言是強型別語言,意思是每個變數和每個表示式都有乙個在編譯時就確定的型別,所以所有變數必須顯式宣告型別,也就是說,所有的變數必須先宣告,後使用。j a語言支援的資料型別分為兩類 基本資料型別 也叫原始資料型別,primitive type 和引用資料型別 reference type 基本型別...