1、引導html
class Demo: def func(self): pass obj = Demo() print(type(obj)) print(type(Demo)) # Demo = type() # 全部你寫的類默認狀況下都是type產生的 # 產生的類稱之爲 元類!! 即type就是元類 # 類的三大特徵: 1.類名 2.父類 3.類的名稱空間
eval與execspa
res = """ print('555') """ res2 = """ for i in range(5): print(i) """ eval(res) # 555 exec(res) # 555 eval(res2) # 報錯 exec(res2) # 1 2 3 4 5 # 從上面執行的結果能夠得知: # eval與exec均可以識別字符串中代碼並執行,可是eval不支持邏輯性代碼
2、不依賴class關鍵字建立類code
如何產生一個類:htm
# 上面說類由:類名、父類、類的名稱空間組成 class_name = 'User' # 類名 class_base = (object,) # 父類,注意必須是元組,逗號不能忘 #類的名稱空間:類體代碼 res = """ school = "oldboy" def __init__(self): self.name = name def func(): pass """ class_attrs = {} exec(res,{},class_attrs) # 將res執行產生的名稱空間放到class_attrs中
# class_global(中間)通常狀況下都爲空,除非在字符串代碼內部用global關鍵字聲明,纔會將產生的名字丟到class_global全局名稱空間中
print(class_attrs)
# {'school': 'oldboy', '__init__': <function __init__ at 0x0000000001D02EA0>, 'func': <function func at 0x00000000027DDE18>}
# 調用元類建立自定義類
User = type(class_name,class_bases,class_attrs) #傳參:將類名、父類、類的名稱空間丟給type產生 print(User) #<class '__main__.User'>
# 它能夠訪問自身的屬性和方法,並實例化產生對象 print(User.school) #oldboy obj = User('Simon') print(obj.name) # Simon print(obj) # <__main__.User object at 0x0000000001E7CF98>
3、自定義元類控制類的建立過程對象
class MymetaClass(type): # 必須是繼承了type的類纔是自定義元類 def __call__(self, *args, **kwargs): # 1.先建立一個對象的名稱空間 __new__ # 2.往更名稱空間中丟一堆名字 __init__ # 3.產生好的對象返回出去 # 1.產生一個空對象 obj = self.__new__(self) # 2.實例化該對象 self.__init__(obj, *args, **kwargs) # 3.返回該對象 return obj # return super().__call__(*args,**kwargs) class Demo(metaclass=MymetaClass): # 指定Demo的元類是MymetaClass pass obj = Demo() print(obj) # <__main__.Demo object at 0x00000000027EC898> print(type(obj)) # <class '__main__.Demo'>
# 標準能夠直接參照這個使用
# 表名 主鍵 一對字段 class MemetaClass(type): # def __new__(cls, class_name,class_bases,class_attrs): if class_name == 'Userinfo': raise TypeError('我不想鳥你') if 'school' in class_attrs: class_attrs['school'] = 'xx最大線上xx開業啦' class_attrs['table_name'] = 'userinfo' class_attrs['primary_key'] = 'id' return type.__new__(cls,class_name,class_bases,class_attrs) class User(object,metaclass=MemetaClass): # 經過metaclass能夠指定類的元類 school = 'oldboy' print(User.__dict__) """ {'__module__': '__main__', 'school': 'xx最大線上xx開業啦', 'table_name': 'userinfo', 'primary_key': 'id', '__dict__': <attribute '__dict__' of 'User' objects>, '__weakref__': <attribute '__weakref__' of 'User' objects>, '__doc__': None} """
最詳細的方法:https://www.cnblogs.com/Dominic-Ji/p/10520256.htmlblog