python_元類

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

相關文章
相關標籤/搜索