Python 元類使用講解


我要一大群的類都具有一種特點,我怎么給他們加上呢?模板嘛,我從這個模板創建一群類不就OK了?那就需要元類了。

定義一個元類(就是一個類的模板!莫多想,還要記住這是類級別的,不是對象級別的!):
代碼如下:

class MyMeta(type):
    def __init__(cls, name, bases, dic):
        print(cls.__name__)
        print(name)

    def __str__(cls):
        return "Beautiful class %s" % cls.__name__


這是個什么東西?哈,這是個元類。是個類的模板。

它要用在哪里?它要用在一個類里,作為這個類的模板。

起的什么作用?模板,就是提供一些共同的特征。

這個類提供了什么樣的特征?兩個特征,1。類定義后打印類的名字(__init__)。2。打印類的格式(__str__)。

到底回怎么工作,打開的你的解釋器,輸入以上的代碼,上路:


第一個:
輸入:

class MyClass(object):
  __metaclass__ = MyMeta

回車結束類的定義時,輸出:

MyClass
MyClass  

事實證明它確實是初始化一個類,而不是一個對象!!!!!這個是第一個特征。

第二個:
輸入:

print(MyClass)

輸出:

Beautiful class MyClass

 

---測試---

下面我們來實現一個Singleton模式
Singleton元類:
代碼如下:

class Singleton(type):
    def __init__(cls, name, bases, dic):
        super(Singleton, cls).__init__(name, bases, dic)
        cls.instance = None

    def __call__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls.instance

  


非常簡單的一個設計模式,相信你能明白是怎么回事!
代碼如下:

class MyClass(object):
    __metaclass__ = Singleton

    def __init__(self, arg):
        self.arg = arg

  


使用了Singleton元類的類。

是不是只能有一個實例呢??
代碼如下:

>>> my1 = MyClass("hello")
>>> my2 = MyClass("world")
>>> my1 is my2
True
>>> my1.arg
hello
>>> my2.arg
hello

  


我們創建my2的嘗試失敗了,而這恰恰證明我們成功了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM