青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Benjamin

靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
數據加載中……

python中的MetaClass(元類)

MetaClass元類,本質也是一個類,但和普通類的用法不同,它可以對類內部的定義(包括類屬性和類方法)進行動態的修改。可以這么說,使用元類的主要目的就是為了實現在創建類時,能夠動態地改變類中定義的屬性或者方法。
一、type() 函數還有一個更高級的用法,即創建一個自定義類型(也就是創建一個類)。
type() 函數的語法格式有 2 種,分別如下:
type(obj)
type(name, bases, dict)
class type(name, bases, dict)
使用1個參數,返回對象的類型。就像object.__class__。內置函數isinstance()被用來測試對象的類型,因為他會考慮到子類。
用3個參數,返回一個新類型對象。本質上,這是類聲明的一種動態形式。
參數name是一個字符串,表示類名稱,并記錄為__name__屬性;
參數bases是一個元組,一個個記下基礎類,并記錄為__bases__屬性,
參數dict是一個字典,包含類本體的命名空間并被賦值到標準字典。并記錄為__dict__屬性。
示例:
#定義一個實例方法
def say(self):
    print("這是 Python!")
#使用 type() 函數創建類
CLanguage = type("CLanguage",(object,),dict(say = say, name = "python語言"))
#創建一個 CLanguage 實例對象
clangs = CLanguage()
#調用 say() 方法和 name 屬性
clangs.say()
print(clangs.name)

二、MetaClass元類,本質也是一個類,但是它可以動態的定制或修改繼承它的子類。
metaclass 是 type 的子類,通過替換 type 的 __call__ 運算符重載機制
用戶自定義類,只不過是 type 類的 __call__ 運算符重載
一個類設計成 MetaClass 元類,其必須符合以下條件:
必須顯式繼承自 type 類;
類中需要定義并實現 __new__() 方法,該方法一定要返回該類的一個實例對象,因為在使用元類創建類時,該 __new__() 方法會自動被執行,用來修改新建的類
#定義一個元類
class FirstMetaClass(type):
    # cls代表動態修改的類
    # name代表動態修改的類名
    # bases代表被動態修改的類的所有父類
    # attr代表被動態修改的類的所有屬性、方法組成的字典
    def __new__(cls, name, bases, attrs):
        # 動態為該類添加一個name屬性
        attrs['name'] = "python語言"
        attrs['say'] = lambda self: print("調用 say() 實例方法")
        return super().__new__(cls,name,bases,attrs)
        #定義類時,指定元類
class CLanguage(object,metaclass=FirstMetaClass):
    pass
clangs = CLanguage()
print(clangs.name)
clangs.say()
用方法來創建元類
def upper_attr(future_class_name, future_class_parents, future_class_attr):
    '''返回一個類對象,將屬性都轉為大寫形式'''
    #  選擇所有不以'__'開頭的屬性
    attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))
# 將它們轉為大寫形式
    uppercase_attr = dict((name.upper(), value) for name, value in attrs)
    # 通過'type'來做類對象的創建
    return type(future_class_name, future_class_parents, uppercase_attr)
__metaclass__ = upper_attr  #  這會作用到這個模塊中的所有類
class Foo(object):
    # 我們也可以只在這里定義__metaclass__,這樣就只會作用于這個類中
    bar = 'bip'

print(hasattr(Foo, 'bar'))
# 輸出: False
print(hasattr(Foo, 'BAR'))
# 輸出:True
f = Foo()
print(f.BAR)、
元類定義了__prepare__以后,會最先執行__prepare__方法,返回一個空的定制的字典,然后再執行類的語句,類中定義的各種屬性被收集入定制的字典,最后傳給new和init方法
3.6版本以前,__prepare__方法主要用來返回一個orderdict對象,以保存類中屬性的添加順序。而3.6版本以后,默認已經是保持順序的了。
class member_table(dict):
    def __init__(self):
        self.member_names = []
    def __setitem__(self, key, value):
        if key not in self:
            self.member_names.append(key)
        dict.__setitem__(self, key, value)

class OrderedClass(type):
    @classmethod
    def __prepare__(metacls, name, bases):
        classdict = member_table()
        print("prepare return dict id is:", id(classdict))
        return classdict
    def __new__(metacls, name, bases, classdict):
        print("new get dict id is:", id(classdict))
        result = type.__new__(metacls, name, bases, dict(classdict))
        result.member_names = classdict.member_names
        print("the class's __dict__ id is:", id(result.__dict__))
        return result
   
    def __init__(cls, name, bases, classdict):
        print("init get dict id is ", id(classdict))
        super().__init__(name, bases, classdict)

class MyClass(metaclass=OrderedClass):
    def method1(self):
        pass
    def method2(self):
        pass
   
    print("MyClass locals() id is ", id(locals()))
在python中,類的__new__、__init__、__call__等方法不是必須寫的,會默認調用,如果自己定義了,就是override,可以custom。既然override了,通常也會顯式調用進行補償以達到extend的目的。
__call__ : 對象可call,注意不是類,是對象。
如果元類中定義了__call__,此方法必須返回一個對象,否則類的實例化就不會起作用。(實例化得到的結果為__call__的返回值)
三、類的__slots__ 屬性只能限制為實例對象動態添加屬性和方法,而無法限制動態地為類添加屬性和方法。
__slots__ 屬性值其實就是一個元組,只有其中指定的元素,才可以作為動態添加的屬性或者方法的名稱。舉個例子
class CLanguage:
    __slots__ = ('name','add','info')
    這意味著,該類的實例對象僅限于動態添加 name、add、info 這 3 個屬性以及 name()、add() 和 info() 這 3 個方法。
    注意,對于動態添加的方法,__slots__ 限制的是其方法名,并不限制參數的個數。
    __slots__ 屬性對由該類派生出來的子類,也是不起作用的,因為_slots__ 屬性限制的對象是類的實例對象,而不是類

posted on 2020-06-28 14:40 Benjamin 閱讀(540) 評論(0)  編輯 收藏 引用 所屬分類: python

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲视频免费观看| 麻豆精品在线视频| 欧美激情在线狂野欧美精品| 久久永久免费| 亚洲九九精品| 欧美丝袜第一区| 亚洲欧美日韩中文视频| 黄色在线一区| 久久人人97超碰精品888| 欧美顶级大胆免费视频| 国产精品分类| 亚洲精品美女久久7777777| 亚洲综合国产精品| 激情久久五月| 欧美日韩一区二区三区视频| 亚洲精品黄色| 久久噜噜噜精品国产亚洲综合| 国产精品美女久久久久久久| 99国产精品国产精品毛片| 一区二区不卡在线视频 午夜欧美不卡在 | 久久成人精品无人区| 久久精品国亚洲| 国模精品一区二区三区| 欧美日韩直播| 久久久欧美精品| 欧美在线播放一区| 亚洲国产婷婷| 亚洲国产日韩在线| 国产日韩欧美a| 国产精品大片| 国产精品人人爽人人做我的可爱 | 久久频这里精品99香蕉| 噜噜爱69成人精品| 欧美激情精品久久久久久| 久久久久.com| 亚洲欧美中文字幕| 亚洲激情自拍| 夜夜嗨一区二区三区| 亚洲男同1069视频| 欧美电影打屁股sp| 亚洲人成77777在线观看网| 91久久精品一区| 亚洲国产精品123| 亚洲精品123区| 亚洲国产欧美一区| 极品少妇一区二区| 99综合精品| 亚洲欧美中日韩| 欧美一区二区观看视频| 午夜一级在线看亚洲| 亚洲综合国产| 一区二区三区偷拍| 一区二区免费在线观看| 欧美有码在线视频| 久久精品99无色码中文字幕| 欧美亚洲一区二区三区| 麻豆成人综合网| 免费看黄裸体一级大秀欧美| 久久嫩草精品久久久久| 欧美激情亚洲精品| 激情伊人五月天久久综合| 国产亚洲电影| 99视频在线观看一区三区| 国产主播一区| 欧美亚洲专区| 亚洲欧美日韩在线| aa亚洲婷婷| 欧美日韩亚洲一区二| 亚洲国产成人精品女人久久久| 激情五月婷婷综合| 久久久国产精品一区| 亚洲成人在线网站| 香蕉av福利精品导航| 欧美日韩在线大尺度| 在线看视频不卡| 午夜精品久久久久99热蜜桃导演| 欧美激情视频一区二区三区在线播放 | 久久久99爱| 亚洲国产欧美在线人成| 先锋影音一区二区三区| 国产精品少妇自拍| 99精品视频免费观看| 亚洲精品午夜| 欧美午夜a级限制福利片| 午夜精品一区二区三区在线播放| 欧美激情精品久久久久久免费印度 | 欧美一区二区三区四区在线 | 久久亚洲精品欧美| 亚洲视频在线观看三级| 狠狠色丁香婷婷综合| 欧美黄色aaaa| 欧美片在线播放| 亚洲国产欧美日韩另类综合| 欧美一区二区视频在线观看| 亚洲欧洲三级| 久久精品91久久久久久再现| 亚洲欧美欧美一区二区三区| 久久综合网色—综合色88| 一本久道久久综合中文字幕| 久久成人18免费观看| 国外成人在线视频网站| 亚洲一区欧美二区| 一区二区欧美在线观看| 欧美日韩综合久久| 亚洲欧美清纯在线制服| 日韩亚洲视频| 欧美电影免费| 亚洲欧洲日韩女同| 亚洲日本成人| 中文有码久久| 亚洲一区二区在线播放| 国产精品三级视频| 久热精品视频在线观看| 欧美一站二站| 国产精品日韩欧美| 欧美mv日韩mv国产网站app| 影音先锋日韩资源| 久久婷婷国产麻豆91天堂| 亚洲国产欧洲综合997久久| 激情视频亚洲| 欧美专区日韩专区| 久久狠狠一本精品综合网| 欧美激情第六页| 亚洲欧美文学| 亚洲精品视频免费在线观看| 久久国产欧美精品| 91久久精品美女高潮| 国产精品成人免费| 久久精品国产综合| 中文亚洲视频在线| 亚洲免费成人av| 久久精彩视频| 午夜欧美精品久久久久久久| 亚洲免费网址| av成人老司机| 在线电影国产精品| 一区在线免费观看| 国产精品久久二区| 欧美日韩国产小视频在线观看| 亚洲午夜国产一区99re久久| 亚洲国产精品传媒在线观看| 女同一区二区| 麻豆精品视频在线观看视频| 亚洲欧洲av一区二区三区久久| 亚洲欧洲综合| 夜夜嗨一区二区三区| 亚洲国产精品嫩草影院| 永久免费精品影视网站| 亚洲精品国产精品国自产观看浪潮 | 91久久综合亚洲鲁鲁五月天| 美女图片一区二区| 欧美日韩中文在线| 久久视频国产精品免费视频在线| 99亚洲伊人久久精品影院红桃| 亚洲婷婷综合久久一本伊一区| 日韩亚洲国产欧美| 久久激情视频| 欧美精品一区二区三区一线天视频| 在线一区观看| 欧美日韩三级在线| 国产精品二区在线| 亚洲日本视频| 久久精品免费| 欧美国产日产韩国视频| 欧美国产日韩精品免费观看| 日韩一区二区精品| 最新高清无码专区| 亚洲欧美日韩天堂| 亚洲精品社区| 欧美性大战久久久久| 亚洲精品国产精品国自产观看| 亚洲巨乳在线| 亚洲三级影院| 免费观看日韩| 一区精品在线| 欧美大胆人体视频| 欧美在线观看你懂的| 欧美一区二区三区免费观看视频| 欧美成人免费视频| 国产精品亚洲综合一区在线观看| 国产一区在线播放| 欧美一区二区三区视频在线| 日韩亚洲一区在线播放| 欧美电影免费观看高清| 91久久精品美女| 欧美激情精品久久久久久黑人| 日韩午夜三级在线| 欧美a级在线| 午夜在线视频一区二区区别| 国产精品久久久久7777婷婷| 一区二区三区久久久| 亚洲人成人一区二区三区| 久久久欧美一区二区| 亚洲人成网站在线播| 亚洲精品黄色| 亚洲成人在线网| 亚洲你懂的在线视频| 最新日韩av| 先锋影音国产一区| 久久精品日韩欧美|