Python編程思想(30):用 metaclass搞定一批類的特性

李寧老師已經在「極客起源」 微信公衆號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公衆號中輸入 160442 開始學習。

《Python編程思想》總目錄
《Python編程思想》專欄

如果希望創建某一批類全部具有某種特徵,則可以通過 metaclass來實現。使用 metaclass可以在創建類時動態修改類定義。爲了使用 metaclass動態修改類定義,程序需要先定義 metaclass, metaclass應該繼承type類,並重寫new()方法。

下面程序定義了一個 metaclass類。

示例代碼:metaclass_demo. py

# 定義MyMetaClass,繼承type
class MyMetaClass(type):
    # cls代表動態修改的類
    # name代表動態修改的類名
    # bases代表被動態修改的類的所有父類
    # attr代表被動態修改的類的所有屬性、方法組成的字典
    def __new__(cls, name, bases, attrs):
        # 動態爲該類添加一個walk方法
        attrs['cal_price'] = lambda self: self.price * self.discount  # 折扣價
        return type.__new__(cls, name, bases, attrs)
# 定義House類
class House(metaclass=MyMetaClass):
    __slots__ = ('name', 'price', '_discount')
    def __init__(self, name, price):
        self.name = name
        self.price = price
    @property
    def discount(self):
        return self._discount
    @discount.setter
    def discount(self, discount):
        self._discount = discount


h = House("河畔小區", 2000000)
h.discount = 0.89
# 創建House對象的discount()方法
print(h.cal_price())

class Book(metaclass=MyMetaClass):
    __slots__ = ('name', 'price', '_discount')
    def __init__(self, name, price):
        self.name = name
        self.price = price
    @property
    def discount(self):
        return self._discount
    @discount.setter
    def discount(self, discount):
        self._discount = discount
b = Book("Python從菜鳥到高手", 128)
b.discount = 0.6
print(b.cal_price())

在這段代碼中定義了House和Book兩個類,在定義這兩個類時都指定了 metaclass屬性,因此當 Python解釋器在創建這兩個類時,MyMetaClass的new方法就會被調用,用於修改這兩個類MyMetaClass類的new方法會爲目標類動態添加 cal_price方法,因此,雖然在定義House和Book類時沒有定義 cal_price方法,但這兩個類依然有 cal_price方法。運行這段代碼,會輸出如下的內容:

1780000.0
76.8

從上面的輸出結果來看,通過使用 metaclass可以動態修改程序中的一批類,對它們集中進行某種修改。這個功能在開發一些基礎性框架時非常有用,程序可以通過使用 metaclass爲某一批需要具有通用功能的類添加屬性和方法。

-----------------支持作者請轉發本文,也可以加李寧老師微信:unitymarvel,或掃描下面二維碼加微信--------
在這裏插入圖片描述

歡迎關注 極客起源 微信公衆號,更多精彩視頻和文章等着你哦!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章