李寧老師已經在「極客起源」 微信公衆號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公衆號中輸入 160442 開始學習。
如果希望創建某一批類全部具有某種特徵,則可以通過 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,或掃描下面二維碼加微信--------
歡迎關注 極客起源 微信公衆號,更多精彩視頻和文章等着你哦!