亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

詳解python單例模式與metaclass

2020-01-04 17:50:51
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了python單例模式與metaclass,文章介紹了單例模式的實現方式
 

單例模式的實現方式

將類實例綁定到類變量上

class Singleton(object):  _instance = None  def __new__(cls, *args):    if not isinstance(cls._instance, cls):      cls._instance = super(Singleton, cls).__new__(cls, *args)    return cls._instance

但是子類在繼承后可以重寫__new__以失去單例特性

class D(Singleton):  def __new__(cls, *args):    return super(D, cls).__new__(cls, *args)

使用裝飾器實現

def singleton(_cls):  inst = {}  def getinstance(*args, **kwargs):    if _cls not in inst:      inst[_cls] = _cls(*args, **kwargs)    return inst[_cls]  return getinstance@singletonclass MyClass(object):  pass

問題是這樣裝飾以后返回的不是類而是函數,當然你可以singleton里定義一個類來解決問題,但這樣就顯得很麻煩了

使用__metaclass__,這個方式最推薦

class Singleton(type):  _inst = {}    def __call__(cls, *args, **kwargs):    if cls not in cls._inst:      cls._inst[cls] = super(Singleton, cls).__call__(*args)    return cls._inst[cls]class MyClass(object):  __metaclass__ = Singleton

metaclass

元類就是用來創建類的東西,可以簡單把元類稱為“類工廠”,類是元類的實例。type就是Python的內建元類,type也是自己的元類,任何一個類

>>> type(MyClass)type>>> type(type)type

python在創建類MyClass的過程中,會在類的定義中尋找__metaclass__,如果存在則用其創建類MyClass,否則使用內建的type來創建類。對于類有繼承的情況,如果當前類沒有找到,會繼續在父類中尋找__metaclass__,直到所有父類中都沒有找到才使用type創建類。
如果模塊里有__metaclass__的全局變量的話,其中的類都將以其為元類,親自試了,沒這個作用,無任何影響

查看type的定義,

type(object) -> the object's type
type(name, bases, dict) -> a new type

所以利用type定義一個類的元類,可以用函數返回一個上面第二種定義的對象,也可以繼承type并重寫其中的方法。

直接使用type生成的對象作為元類,函數作用是使屬性變為大寫

def update_(name, bases, dct):  attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))  uppercase_attr = {name.upper(): value for name, value in attrs}  return type(name, bases, uppercase_attr)class Singleton(object):  __metaclass__ = update_  abc = 2d = Singleton()print d.ABC# 2

上一節中,單例模式元類實現用的是類繼承方式,而對于第一種__new__的方式,本質上調用的是type.__new__,不過使用super能使繼承更清晰一些并避免一些問題

這里簡單說明一下,__new__是在__init__前調用的方法,會創建對象并返回,而__init__則是用傳入的參數將對象初始化??匆幌聇ype中這兩者以及__call__的實現

def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__    """    type(object) -> the object's type    type(name, bases, dict) -> a new type    # (copied from class doc)    """    pass@staticmethod # known case of __new__def __new__(S, *more): # real signature unknown; restored from __doc__  """ T.__new__(S, ...) -> a new object with type S, a subtype of T """  passdef __call__(self, *more): # real signature unknown; restored from __doc__  """ x.__call__(...) <==> x(...) """  pass

前面提到類相當于元類的實例化,再聯系創建單例模式時使用的函數,用的是__call__,其實用三種magic method中任何一種都是可以的,來看一下使用元類時各方法的調用情況

class Basic(type):  def __new__(cls, name, bases, newattrs):    print "new: %r %r %r %r" % (cls, name, bases, newattrs)    return super(Basic, cls).__new__(cls, name, bases, newattrs)  def __call__(self, *args):    print "call: %r %r" % (self, args)    return super(Basic, self).__call__(*args)  def __init__(cls, name, bases, newattrs):    print "init: %r %r %r %r" % (cls, name, bases, newattrs)    super(Basic, cls).__init__(name, bases, dict)class Foo:  __metaclass__ = Basic  def __init__(self, *args, **kw):    print "init: %r %r %r" % (self, args, kw)a = Foo('a')b = Foo('b')

結果

new: <class '__main__.Basic'> 'Foo' () {'__module__': '__main__', '__metaclass__': <class '__main__.Basic'>, '__init__': <function init at 0x106fd5320>}init: <class '__main__.Foo'> 'Foo' () {'__module__': '__main__', '__metaclass__': <class '__main__.Basic'>, '__init__': <function init at 0x106fd5320>}call: <class '__main__.Foo'> ('a',)init: <__main__.Foo object at 0x106fee990> ('a',) {}call: <class '__main__.Foo'> ('b',)init: <__main__.Foo object at 0x106feea50> ('b',) {}

元類的__init__和__new__只在創建類Foo調用了一次,而創建Foo的實例時,每次都會調用元類的__call__方法

以上就是本文的全部內容,對python單例模式與metaclass進行了描述,希望對大家的學習有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品自拍第一页| 亚洲久久久久久久久久| 青青草一区二区| 国产欧美日韩精品丝袜高跟鞋| 亚洲新中文字幕| 55夜色66夜色国产精品视频| 欧美一级片久久久久久久| 成人在线观看视频网站| 国产精品久久久久久av福利软件| 午夜精品一区二区三区视频免费看| 国产精品免费视频xxxx| 国内精品在线一区| 成人福利视频在线观看| 久久精品国产一区二区三区| 欧美日韩国产专区| 久久久久久久久久久久av| 国产精品久久久久999| 欧美日本亚洲视频| 欧美激情精品久久久久久久变态| 亚洲午夜精品久久久久久性色| 久久精品国产一区二区三区| 91精品综合久久久久久五月天| 2019亚洲日韩新视频| 亚洲一区二区三区四区视频| 日韩精品福利网站| 欧洲一区二区视频| 久精品免费视频| 精品日本美女福利在线观看| 欧美在线观看www| 国产一区二区丝袜| 成人免费福利视频| 亚洲aaaaaa| 国产欧美日韩丝袜精品一区| 欧美性极品少妇精品网站| 亚洲国产美女精品久久久久∴| 91精品国产综合久久香蕉| 欧美成人精品不卡视频在线观看| 久久全国免费视频| 欧美性生交xxxxx久久久| 国产精品流白浆视频| 亚洲视频网站在线观看| 久久久精品美女| 亚洲欧美一区二区三区久久| 97免费视频在线| 亚洲欧美在线播放| 国产一区在线播放| 91精品国产色综合久久不卡98口| 亚洲欧美另类在线观看| 91亚洲人电影| 亚洲免费成人av电影| 亚洲成人免费在线视频| 亚州成人av在线| 欧美大胆a视频| 日韩精品视频在线观看网址| 亚洲欧美激情精品一区二区| 欧美成人在线免费视频| 国产又爽又黄的激情精品视频| 北条麻妃一区二区三区中文字幕| 91啪国产在线| 亚洲精品aⅴ中文字幕乱码| 亚洲丁香久久久| 91精品91久久久久久| 亚洲成人精品视频在线观看| 国产精品久久视频| 69av视频在线播放| 最新亚洲国产精品| 中日韩午夜理伦电影免费| 亚洲成色777777女色窝| 国产午夜精品全部视频播放| 亚洲美女又黄又爽在线观看| 日韩成人在线网站| 欧美日韩国产限制| 日本午夜在线亚洲.国产| 欧洲日韩成人av| 日韩中文字在线| 中国日韩欧美久久久久久久久| 91精品国产91久久久久久久久| 亚洲网址你懂得| 国产91露脸中文字幕在线| 亚洲欧美另类人妖| 久久久久久久久久久免费精品| 成人精品久久av网站| 欧美精品999| 国内精品视频久久| 中文字幕精品在线| 最新国产精品亚洲| 国产精品 欧美在线| 福利视频导航一区| 久久这里有精品视频| 欧美电影免费在线观看| 欧美劲爆第一页| 少妇精69xxtheporn| 国产a∨精品一区二区三区不卡| 亚洲国产91色在线| 69av成年福利视频| 久久精品91久久香蕉加勒比| 亚洲石原莉奈一区二区在线观看| 国产一区二区三区精品久久久| 国产精品欧美激情在线播放| 国产精品欧美日韩| 精品香蕉在线观看视频一| 国产欧美在线播放| 日韩最新中文字幕电影免费看| 中文字幕精品av| 国产最新精品视频| 国产综合在线视频| 日韩精品久久久久久久玫瑰园| 亚洲成人教育av| 自拍偷拍亚洲区| 欧美性生交xxxxx久久久| 国产精品电影在线观看| 91av网站在线播放| 欧美中文在线免费| 久久99国产精品久久久久久久久| 欧美肥臀大乳一区二区免费视频| 欧美剧在线观看| 色系列之999| 中文字幕一区日韩电影| 亚洲激情电影中文字幕| 国产精品亚洲一区二区三区| 久久精品最新地址| 欧美成人免费va影院高清| 97视频在线免费观看| 久久久av网站| 国产精品成人va在线观看| 日韩av在线直播| 日韩av不卡在线| 精品人伦一区二区三区蜜桃网站| 久久久精品国产| 上原亚衣av一区二区三区| 亚洲最大成人网色| 91探花福利精品国产自产在线| 91久久精品国产91性色| 欧美寡妇偷汉性猛交| 久久久久久18| 久久乐国产精品| 国产精品嫩草影院一区二区| 久久久久免费视频| 欧美激情精品久久久久久久变态| 日韩成人在线网站| 久久久久久亚洲精品中文字幕| 欧美中文在线字幕| 最近2019年手机中文字幕| 亚洲欧美日韩精品久久亚洲区| 国产欧美最新羞羞视频在线观看| 亚洲欧美一区二区精品久久久| 亚洲福利在线观看| 美女视频黄免费的亚洲男人天堂| 亚洲天堂av图片| 91久久在线播放| 在线观看中文字幕亚洲| 夜色77av精品影院| 91亚洲一区精品| 91成人国产在线观看| 亚洲成色www8888| 亚洲精品久久久久中文字幕二区| 国产精品国产福利国产秒拍| 日本中文字幕久久看| 亚洲精品自在久久| 夜色77av精品影院| 国产精品国产亚洲伊人久久| 在线观看欧美www| 久久精品国产成人精品| 欧美午夜视频一区二区|