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

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在线精品免费视频九九视| 91久久国产综合久久91精品网站| 欧美中文字幕久久| 久久久久一区| 在线午夜精品自拍| 亚洲欧美日韩专区| **性色生活片久久毛片| 91久久久亚洲精品| 国产欧美日韩激情| 亚洲日本黄色| 亚洲黄色av| 久久成人人人人精品欧| 亚洲毛片一区二区| 久久精品人人做人人爽| 一本久久a久久精品亚洲| 欧美专区福利在线| 午夜精品三级视频福利| 欧美成人一二三| 久久久青草婷婷精品综合日韩 | 美女国内精品自产拍在线播放| 香蕉成人啪国产精品视频综合网| 欧美成人午夜视频| 欧美国产日韩免费| 精品成人国产在线观看男人呻吟| 亚洲欧美日韩在线综合| 亚洲一区三区电影在线观看| 欧美高清成人| 亚洲大胆女人| 国产揄拍国内精品对白| 西瓜成人精品人成网站| 亚洲欧美色一区| 国产精品久久久久毛片大屁完整版| 在线中文字幕一区| 亚洲免费视频中文字幕| 欧美性大战xxxxx久久久| 亚洲视频你懂的| 欧美成人精品一区| 亚洲人成在线免费观看| 亚洲人成网站在线播| 欧美国产精品一区| 99视频在线观看一区三区| 久久久www成人免费毛片麻豆| 国一区二区在线观看| 久久久久国产精品一区| 亚洲国产精品久久91精品| 欧美伊人久久久久久久久影院| 国产精品视频自拍| 欧美了一区在线观看| 午夜精品久久久久久久99热浪潮| 欧美jizzhd精品欧美巨大免费| 亚洲美女在线看| 国产亚洲欧洲| 国产午夜精品一区二区三区视频| 欧美aa国产视频| 午夜精品久久久久久久99热浪潮| av成人动漫| 亚洲人成7777| 国产精品高潮呻吟视频| 久久尤物视频| 欧美在线免费播放| 亚洲在线黄色| 性欧美长视频| 久久精品72免费观看| 久久狠狠婷婷| 久久精品国产综合| 久久久蜜桃一区二区人| 久久精品国产99精品国产亚洲性色| 午夜精品成人在线视频| 午夜伦理片一区| 久久午夜国产精品| 免费久久久一本精品久久区| 欧美福利视频在线| 91久久久久久久久| 亚洲国产综合视频在线观看| 亚洲日本成人女熟在线观看| 亚洲国产第一| 欧美一区二区久久久| 久久久91精品国产一区二区三区| 美女在线一区二区| 国产精品日本欧美一区二区三区| 欧美体内she精视频| 国模精品一区二区三区| 亚洲丰满在线| 久久爱另类一区二区小说| 欧美福利视频| 91久久精品网| 亚洲午夜精品久久久久久app| 久久九九有精品国产23| 国产精品丝袜xxxxxxx| 在线一区二区日韩| 久久久无码精品亚洲日韩按摩| 亚洲国产日日夜夜| 欧美一级视频一区二区| 欧美视频三区在线播放| 亚洲精品国产精品国自产在线 | 午夜精品久久99蜜桃的功能介绍| 久久婷婷综合激情| 国语自产偷拍精品视频偷| 午夜日韩福利| 久久国产欧美精品| 激情一区二区三区| 久久久久久999| 久久嫩草精品久久久精品一| 国产精品免费看久久久香蕉| 亚洲制服欧美中文字幕中文字幕| 亚洲精品影院| 国产精品国产三级国产专播品爱网 | 亚洲大胆在线| 最新成人在线| 国产精品视频一二| 亚洲午夜久久久久久久久电影院 | 国产亚洲视频在线| 久久在线视频在线| 美女尤物久久精品| 一区二区三区精品视频在线观看| 亚洲精品久久视频| 国产精品一卡二卡| 欧美大片免费观看| 欧美视频久久| 久久一区二区视频| 欧美日韩国产色视频| 久久gogo国模裸体人体| 久久婷婷影院| 午夜精品久久久久久久男人的天堂 | 亚洲欧洲av一区二区| 国产亚洲毛片在线| 免费视频最近日韩| 欧美午夜在线| 亚洲精品在线一区二区| 亚洲国产精品一区二区www在线| 99国内精品久久| 亚洲美女啪啪| 欧美xxxx在线观看| 久久精品国产99| 欧美三级精品| 久久天天躁狠狠躁夜夜av| 久久久噜噜噜久噜久久| 久久国产乱子精品免费女 | 国产午夜精品一区二区三区欧美| 免费欧美日韩国产三级电影| 国产乱人伦精品一区二区| 亚洲欧洲精品天堂一级| 在线日韩一区二区| 欧美男人的天堂| 中文在线不卡| 亚洲欧美日韩系列| 国产伦精品一区二区三区视频黑人 | 久久久午夜视频| 亚洲网在线观看| 欧美在线免费| 激情六月婷婷久久| 欧美不卡在线视频| av成人免费| 久久精品一区蜜桃臀影院| 一区二区三区在线视频免费观看| 午夜日韩在线观看| 久久久久国产精品一区三寸 | 亚洲视频在线一区观看| 国产日产欧产精品推荐色| 久久亚洲综合色一区二区三区| 免费看黄裸体一级大秀欧美| 91久久香蕉国产日韩欧美9色| 欧美新色视频| 久久三级视频| 99精品视频一区| 久久综合狠狠| 性做久久久久久久免费看| 国产九色精品成人porny| 美女国内精品自产拍在线播放| 99热在这里有精品免费| 久久一区亚洲| 久久综合狠狠综合久久综合88| 亚洲一区二区三区在线播放| 亚洲欧洲精品成人久久奇米网| 国产女主播视频一区二区| 国产精品福利av| 国产精品日本精品| 国产精品视频免费| 国产精品亚洲美女av网站| 国产精品国产三级国产普通话三级 | 国产精品久久久久久久浪潮网站| 欧美日韩高清区| 欧美精品一区视频| 欧美国产视频在线观看| 欧美黑人多人双交| 欧美精品自拍| 国产欧美精品| 亚洲福利电影| 亚洲男人的天堂在线| 久久色在线播放| 亚洲精品美女在线观看| 亚洲精品偷拍| 亚洲精品在线视频|