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

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>
            亚洲少妇在线| 亚洲视频免费在线观看| 久久艳片www.17c.com| 亚洲免费影视| 欧美一区二区三区四区在线观看地址| 亚洲色图制服丝袜| 宅男在线国产精品| 欧美一区精品| 女女同性女同一区二区三区91| 久久久精品一品道一区| 欧美国产精品日韩| 国产精品福利网站| 国产一区二区三区四区| 亚洲日韩第九十九页| 正在播放欧美视频| 久久aⅴ乱码一区二区三区| 欧美制服丝袜| 亚洲成人资源网| 亚洲精品女人| 亚洲性xxxx| 久久亚洲私人国产精品va| 欧美女主播在线| 国产亚洲精品久| 日韩一二三区视频| 欧美专区日韩专区| 亚洲高清视频在线观看| 日韩视频一区二区三区| 久久国产66| 欧美亚州韩日在线看免费版国语版| 国产一区视频在线观看免费| 亚洲美女在线观看| 美国十次了思思久久精品导航| 亚洲欧洲免费视频| 久久精品国产99国产精品澳门| 欧美风情在线| 永久免费精品影视网站| 午夜精品国产更新| 亚洲精品国产品国语在线app| 亚洲综合色自拍一区| 久久久噜噜噜久久中文字幕色伊伊| 国产精品国产三级国产普通话99| 精品成人一区| 久久成人精品无人区| 一本久道久久综合婷婷鲸鱼| 久久精视频免费在线久久完整在线看| 欧美日韩国产在线播放| 亚洲黄色三级| 久久综合九色欧美综合狠狠| 亚洲制服av| 国产精品久久久久婷婷| 一区二区三区日韩在线观看 | 久久综合伊人77777| 国产欧美日韩一区二区三区在线| 一本色道久久综合| 欧美寡妇偷汉性猛交| 久久久www| 一区在线影院| 美女性感视频久久久| 久久久久99| 激情六月婷婷综合| 麻豆成人在线观看| 麻豆精品精华液| 亚洲国产欧美精品| 欧美黄色一区| 欧美激情精品久久久久久免费印度| 亚洲高清不卡| 亚洲电影下载| 欧美日韩一区二区免费在线观看| 最新亚洲视频| 99re这里只有精品6| 欧美日本精品| 亚洲免费在线电影| 性色av一区二区三区在线观看| 国产精品一区二区在线观看不卡 | 亚洲午夜免费福利视频| 亚洲精品在线一区二区| 欧美午夜免费电影| 欧美一区二区免费观在线| 欧美亚洲一区二区在线| 激情综合视频| 欧美激情一区二区三区在线视频 | 国产精品国产福利国产秒拍 | 欧美aⅴ99久久黑人专区| 免费视频一区| 亚洲靠逼com| 亚洲性图久久| 136国产福利精品导航| 亚洲激情欧美| 国产视频亚洲精品| 亚洲国产日韩一区| 国产深夜精品福利| 亚洲精品亚洲人成人网| 亚洲欧洲日夜超级视频| 国产精品看片资源| 欧美大片免费看| 国产精品v欧美精品v日本精品动漫 | 亚洲黄一区二区三区| 亚洲免费黄色| 极品少妇一区二区| 最新日韩精品| 一区二区三区在线视频免费观看| 亚洲精品一区二区在线| 激情亚洲一区二区三区四区| 日韩网站在线看片你懂的| 黄色在线一区| 亚洲综合色丁香婷婷六月图片| 在线成人中文字幕| 亚洲欧美在线一区二区| 99re8这里有精品热视频免费 | 国产主播喷水一区二区| 日韩网站在线看片你懂的| 亚洲电影在线播放| 亚洲一区中文| 亚洲一区二区三区四区中文 | 一个色综合av| 久久只有精品| 久久爱www久久做| 欧美视频免费在线| 最新日韩在线| 亚洲人体大胆视频| 久久久综合精品| 久久九九国产精品| 国产精品视屏| 亚洲伊人伊色伊影伊综合网| 日韩视频中文| 欧美另类一区二区三区| 久久久久高清| 国产一区视频在线看| 性色av一区二区怡红| 欧美一区二区三区免费视频| 国产精品vvv| 亚洲网站在线观看| 亚洲一区二区三区四区中文 | 一个人看的www久久| 亚洲精品视频在线| 欧美精品久久久久久久| 91久久午夜| 亚洲开发第一视频在线播放| 牛夜精品久久久久久久99黑人| 欧美xxx成人| 亚洲精品国产拍免费91在线| 蜜臀久久久99精品久久久久久| 免费观看日韩av| 91久久精品www人人做人人爽| 国语自产精品视频在线看| 久久国内精品视频| 国产欧美日韩精品一区| 亚洲欧美日韩精品久久久久| 午夜精品视频| 国产一区二区三区精品久久久 | 久久精品一区| 免费亚洲一区| 亚洲美女免费精品视频在线观看| 欧美精品播放| 中文日韩在线视频| 欧美在线视频日韩| 亚洲第一在线综合在线| 欧美精品三级日韩久久| 亚洲网站在线观看| 久久激情网站| 亚洲毛片一区二区| 国产精品永久| 久久综合伊人77777| 日韩视频免费观看高清完整版| 亚洲精品韩国| 99精品国产热久久91蜜凸| 亚洲欧美国产另类| 在线观看国产成人av片| 欧美区在线播放| 午夜在线成人av| 欧美国产另类| 亚洲综合第一页| 亚洲国产精品小视频| 国产精品久久久久久妇女6080| 久久国产福利| 日韩一区二区电影网| 久久久亚洲综合| 一本到高清视频免费精品| 久久综合狠狠综合久久综青草| 亚洲一级特黄| 亚洲美女91| 在线视频国内自拍亚洲视频| 欧美性淫爽ww久久久久无| 久久中文字幕一区| 欧美一级午夜免费电影| av成人免费观看| 亚洲电影在线观看| 久久综合色婷婷| 欧美一区二区精品| 亚洲欧美乱综合| 一区二区精品国产| 亚洲国产天堂久久国产91| 国产一区二区三区的电影| 欧美午夜在线一二页| 欧美黑人多人双交| 老司机67194精品线观看| 欧美自拍偷拍午夜视频| 亚洲欧美成人一区二区三区| 99在线|亚洲一区二区| 亚洲精品午夜|