首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python编程思想(30):用 metaclass搞定一批类的特性

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

作者头像
蒙娜丽宁
修改2020-07-07 16:07:53
3720
修改2020-07-07 16:07:53
举报
文章被收录于专栏:极客起源极客起源

如果希望创建某一批类全部具有某种特征,则可以通过 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):
        # 动态为该类添加一个cal_price方法
        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为某一批需要具有通用功能的类添加属性和方法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客起源 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档