#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 物件
(f.bar)
#輸出:'bip',metaclass修改了foo類
classupperattrmetaclass(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 基本型別...