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

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>
            欧美一区二区三区成人| 午夜精品久久久久久久久久久| 午夜精品在线看| 午夜亚洲影视| 亚洲视频图片小说| 日韩小视频在线观看| 一本一本久久| 久久国产精品99国产精| 毛片基地黄久久久久久天堂| 亚洲国产日韩综合一区| 一区免费观看视频| 在线观看不卡av| 亚洲午夜精品久久久久久app| 午夜精品国产精品大乳美女| 午夜精品视频在线| 欧美喷潮久久久xxxxx| 国产日产精品一区二区三区四区的观看方式| 国产一区二区三区无遮挡| 亚洲精品久久视频| 久久精品国亚洲| 99精品视频网| 欧美成人情趣视频| 国产伦精品一区二区三区免费| 亚洲国内高清视频| 国产视频精品va久久久久久| 久久精品国产91精品亚洲| 欧美在线free| 国产精品热久久久久夜色精品三区| 激情久久五月| 日韩一级黄色av| 欧美福利小视频| 亚洲国产99| 免费人成精品欧美精品| 欧美一区三区二区在线观看| 亚洲欧洲精品一区二区精品久久久| 久久久久久久成人| 午夜精品福利在线| 99爱精品视频| 久久视频这里只有精品| 国内精品视频在线播放| 久久久777| 国产精品久久久久久五月尺| 在线综合欧美| 中文精品视频| 日韩亚洲欧美一区二区三区| 久久成人免费日本黄色| 国产亚洲欧美日韩日本| 一本色道久久综合亚洲精品小说 | 国产日韩欧美不卡在线| 亚洲黄色视屏| 欧美国产一区在线| 久久久最新网址| 久久久久网址| 亚洲乱码国产乱码精品精98午夜| 亚洲高清二区| 国产精品theporn88| 亚洲免费影视| 久久福利资源站| 销魂美女一区二区三区视频在线| 欧美区高清在线| 亚洲人成网站色ww在线 | 久久人人超碰| 国产精品入口夜色视频大尺度 | 亚洲视频碰碰| 午夜在线播放视频欧美| 亚洲伊人网站| 久久久蜜桃一区二区人| 久久久蜜桃精品| 韩国一区二区三区在线观看| 亚洲国产精品一区二区第一页| 在线国产亚洲欧美| 夜夜嗨av一区二区三区四区| 一区二区三区日韩欧美| 欧美午夜精品理论片a级按摩 | 亚洲一区二区三区在线观看视频| 欧美午夜欧美| 亚洲欧美激情在线视频| 亚洲国产精品久久久久秋霞不卡| 久久亚洲综合色一区二区三区| 欧美成人一品| 国产欧美1区2区3区| 久久国产精品亚洲77777| 美女国内精品自产拍在线播放| 91久久精品国产91久久性色| 一区二区三区欧美成人| 欧美午夜电影在线| 亚洲女同性videos| 久久久久国产精品人| 亚洲国产另类精品专区| 欧美日韩高清在线播放| 老色鬼久久亚洲一区二区| 亚洲国产精品一区二区第一页 | 亚洲国产成人久久综合一区| 亚洲精品综合精品自拍| 欧美午夜不卡在线观看免费| 性欧美超级视频| 亚洲国产精品精华液2区45| 一本色道久久88精品综合| 国产日韩精品在线观看| 欧美大片国产精品| 亚洲欧美国产三级| 欧美成人精品在线观看| 国产午夜精品一区二区三区视频| 狂野欧美性猛交xxxx巴西| 欧美亚洲免费在线| 亚洲电影自拍| 国产精品捆绑调教| 欧美freesex交免费视频| 老鸭窝91久久精品色噜噜导演| 日韩系列欧美系列| 伊大人香蕉综合8在线视| 欧美日韩一区二区欧美激情| 99视频日韩| 免费欧美在线视频| 欧美一区二区精品| 国产日韩久久| 欧美午夜宅男影院在线观看| 久热精品视频在线免费观看| 亚洲欧美在线磁力| 亚洲精品日韩在线观看| 亚洲视频1区2区| 91久久综合亚洲鲁鲁五月天| 激情六月婷婷久久| 国产精品午夜电影| 欧美日韩一卡二卡| 男男成人高潮片免费网站| 亚洲综合国产| 一区二区三区蜜桃网| 亚洲精品视频在线观看免费| 欧美二区视频| 久久综合导航| 中文有码久久| 亚洲精品一区二区三区在线观看| 极品裸体白嫩激情啪啪国产精品| 国产精品一区在线播放| 欧美午夜三级| 国产精品v欧美精品v日韩| 欧美精品成人一区二区在线观看 | 日韩视频亚洲视频| 亚洲精美视频| 亚洲精品国产精品乱码不99| 在线观看三级视频欧美| 精品成人免费| 在线成人h网| 亚洲大片在线观看| 在线看欧美视频| 亚洲国产精品精华液2区45| 亚洲国产欧美一区二区三区久久 | 国产精品红桃| 国产精品大片免费观看| 一区二区福利| 亚洲美女少妇无套啪啪呻吟| 久久人人爽人人爽| 一本久道久久综合狠狠爱| 亚洲经典在线| 亚洲日本在线视频观看| 亚洲国产精品成人综合| 亚洲国产高清自拍| 亚洲国产美女精品久久久久∴| 一区二区亚洲欧洲国产日韩| 黄色小说综合网站| 亚洲第一天堂av| 91久久精品国产91性色| 日韩视频一区二区三区| 一区二区激情小说| 性8sex亚洲区入口| 欧美成人亚洲| 日韩午夜在线播放| 午夜精品久久久久99热蜜桃导演| 亚洲激情专区| 日韩视频免费观看高清在线视频 | 久久免费视频网站| 欧美成人一区二区三区片免费| 欧美精品成人一区二区在线观看| 国产精品久久久久久久久久妞妞| 国产亚洲a∨片在线观看| 亚洲第一精品电影| 99精品热6080yy久久| 久久九九全国免费精品观看| 亚洲国产精品高清久久久| 亚洲视频免费看| 老司机午夜精品视频| 国产精品成人在线| 在线欧美日韩| 午夜精品美女自拍福到在线| 免费视频一区二区三区在线观看| 亚洲另类视频| 久久午夜影视| 国产精品色午夜在线观看| 亚洲国产精品www| 欧美一区日本一区韩国一区| 国产精品一区二区三区免费观看| 久久亚洲午夜电影| 欧美一区成人| 欧美精品videossex性护士| 亚洲第一视频| 午夜精品免费| 欧美久久电影| 亚洲国产精品欧美一二99| 欧美在线一级视频|