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

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>
            欧美 亚欧 日韩视频在线| 久久久久久亚洲精品不卡4k岛国| 欧美va亚洲va日韩∨a综合色| 香蕉av福利精品导航| 一区二区三区高清在线观看| 亚洲日本欧美在线| 农村妇女精品| 久久人体大胆视频| 亚洲视频一起| 欧美成人国产va精品日本一级| 久久亚洲精品网站| 免播放器亚洲| 亚洲狼人综合| 亚洲欧美www| 久久久久久久国产| 欧美成人免费网站| 欧美日韩国产大片| 国产精品每日更新| 国产亚洲观看| 亚洲高清色综合| 一区二区三区日韩精品| 午夜久久久久久| 免费日韩视频| 日韩一区二区久久| 欧美一站二站| 欧美视频网站| 一区二区视频免费在线观看| 99精品视频一区二区三区| 欧美一级专区| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲欧洲99久久| 久久综合精品国产一区二区三区| 亚洲黄色有码视频| 久久爱www久久做| 亚洲国产欧美在线人成| 亚洲欧美成人综合| 欧美日韩国产专区| 亚洲电影免费观看高清完整版在线观看 | 亚洲黄色免费电影| 欧美影院精品一区| 亚洲看片网站| 欧美成人精品激情在线观看 | 欧美ed2k| 国产一区二区三区在线观看精品| 亚洲一区二区三区精品动漫| 亚洲国产欧美一区二区三区久久 | 亚洲高清视频在线观看| 香港久久久电影| 亚洲欧洲偷拍精品| 久久综合婷婷| 国产精品无码专区在线观看| 国产精品久久久一区二区| 国产精品一区二区三区久久| 1024国产精品| 亚洲美女色禁图| 欧美国产精品| 午夜亚洲性色福利视频| 欧美高清不卡| 欧美成人午夜免费视在线看片| 美国成人直播| 亚洲一区久久| 国产精品国产三级国产aⅴ入口| 亚洲东热激情| 麻豆精品精华液| 久久青草欧美一区二区三区| 精品成人一区二区| 欧美午夜久久| 一本大道久久精品懂色aⅴ| 欧美激情第一页xxx| 欧美jizz19性欧美| 亚洲精品在线观看免费| 欧美激情乱人伦| 欧美风情在线| 一本大道久久a久久综合婷婷 | 亚洲自拍三区| 亚洲一区二区三区精品动漫| 国产精品一区二区三区久久| 久久久久久色| 久久亚洲欧美| 在线亚洲观看| 欧美一级久久| 亚洲激情欧美| 亚洲午夜久久久久久久久电影网| 国产精品永久免费观看| 久久久噜久噜久久综合| 裸体素人女欧美日韩| 日韩系列在线| 亚洲欧美日韩高清| 亚洲国产精品精华液2区45| 最新中文字幕亚洲| 欧美亚州一区二区三区| 久久噜噜噜精品国产亚洲综合| 蜜桃伊人久久| 欧美一区二区高清| 美女图片一区二区| 亚洲一区黄色| 免费不卡在线观看av| 亚洲男女自偷自拍| 久久久亚洲高清| 亚洲免费视频成人| 欧美jizz19性欧美| 久久久久久久综合色一本| 欧美另类高清视频在线| 欧美专区亚洲专区| 久久久久高清| 欧美aaa级| 午夜精品在线观看| 美女福利精品视频| 欧美在线观看视频| 欧美日韩国产成人在线91| 久久久五月天| 国产精品久久久久影院色老大| 欧美高清在线精品一区| 国产精品一级在线| 日韩一级精品视频在线观看| 亚洲成人资源| 欧美专区中文字幕| 亚洲欧美视频在线观看| 欧美国产一区视频在线观看| 久久久蜜桃一区二区人| 国产精品男人爽免费视频1| 亚洲日本激情| 亚洲国产欧美不卡在线观看| 欧美一区二区三区在线看| 亚洲影视中文字幕| 欧美日韩精品一区二区在线播放| 欧美成人国产一区二区| 狠狠网亚洲精品| 欧美一区二区三区的| 欧美一级大片在线免费观看| 欧美日韩视频在线一区二区| 亚洲精品极品| 99精品欧美一区二区蜜桃免费| 免费不卡中文字幕视频| 欧美 日韩 国产在线| 亚洲高清不卡在线| 蜜桃久久av一区| 亚洲狠狠丁香婷婷综合久久久| 亚洲欧洲综合另类| 欧美精品18+| 99re6热只有精品免费观看| 日韩视频在线观看国产| 欧美女同视频| 一区二区电影免费观看| 亚洲图片激情小说| 国产精品久久久久久久久久直播 | 久久天天综合| 狠狠干综合网| 久久亚洲精品伦理| 亚洲国产高清aⅴ视频| 亚洲精品国产品国语在线app| 欧美成ee人免费视频| 亚洲精品久久久久久久久久久久| 一区二区三区蜜桃网| 国产精品久久久久久福利一牛影视 | 亚洲免费在线| 国产一区二区三区久久久| 久久久久国产一区二区三区四区| 欧美成人在线免费视频| 一区二区三区 在线观看视频| 国产精品久久久久久久久免费桃花 | 日韩午夜在线播放| 亚洲精品综合| 国产精品初高中精品久久| 亚洲女性裸体视频| 免费视频一区二区三区在线观看| 日韩午夜av在线| 国产精品试看| 欧美+亚洲+精品+三区| 一区二区三区国产在线| 久久精品一二三区| 99re6热只有精品免费观看| 国产精品一区=区| 欧美电影免费| 欧美在线播放| 国产精品夜夜嗨| 亚洲人成网站影音先锋播放| 国产午夜精品一区二区三区欧美 | 蜜臀久久99精品久久久久久9| 亚洲日本一区二区三区| 久久精品国产精品亚洲精品| 在线播放亚洲| 欧美视频一区二区在线观看 | 欧美精品导航| 久久国产精品一区二区三区| 亚洲精品护士| 麻豆久久婷婷| 久久久夜夜夜| 亚洲一区视频在线| 亚洲国产欧美一区二区三区丁香婷| 午夜一区二区三视频在线观看| 亚洲国产一区二区视频| 国产日韩av在线播放| 欧美日本国产视频| 久久婷婷久久| 久久成人国产| 午夜电影亚洲| 亚洲一区亚洲二区| 一本久道久久久| 91久久久久久久久|