美文网首页
如何自定义类的创建行为

如何自定义类的创建行为

作者: kingron | 来源:发表于2021-12-13 18:12 被阅读0次

问题

如果我们要给类加上一个属性,只需在定义的时候加上属性就可以了:

class Animal:
    can_fly = True

如果这样的类有很多,我们可以定义一个父类,让其它类继承他就可以了:

class FlyAnimal:
    can_fly = True
    

class Bird(FlyAnima):
    pass

class Duck(FlyAnimal):
    pass

...

要是不想显示的定义这些属性,只需要根据名字或其它属性来定义它的 can_fly 属性呢?(虽然这样的做法如同产品的需求一样 BT)这就可以用到元类了。

解决方案

通常情况下,我们先定义类,然后进行实例化。如果有了元类,那么类就相当于元类的实例——也就是说,先有元类,然后才有类。

因此,我们就可以创建元类来实现对类创建行为的控制。那么如何定义元类来实现需求呢?以上文的问题来,可以做如下定义:

class AnimalMetaclass(type):
    
    def __new__(cls, name, bases, attrs):
        if name.lower() in ['bird', 'duck']:
            attrs['can_fly'] = True
        return type.__new__(cls, name, bases, attrs)
    

class Animal(object, metaclass=AnimalMetaclass):
    pass


class Bird(Animal):
    pass

下面让我们来试试效果:

>>> Bird.can_fly
True

看起来非常成功!

扩展

  • 元类需要继承自 type
  • __new__ 方法接收的参数分别为:
    • cls 当前准备创建类的对象
    • name 类的名字
    • bases 类的父类集合
    • attrs 类的属性字典
  • 使用元类时,通常会定义一个基类,用类指明元类,其它类继承自该基类即可

相关文章

  • Android Studio如何自定义类注释模板

    创建类的时候如何自定义类的各项注释? 创建步骤: 1、File——>Settings...——>Editor——>...

  • 如何自定义类的创建行为

    问题 如果我们要给类加上一个属性,只需在定义的时候加上属性就可以了: 如果这样的类有很多,我们可以定义一个父类,让...

  • JavaSE学习笔记——枚举类

    如何自定义枚举类私有化类构造器,保证不能在类外部创建对象实例。在类的内部创建枚举类的对象实例,声明为private...

  • 自定义 Framework创建及使用

    一,自定义框架 1,创建自定义框架工程 2,创建自定义框架的类,相信大家都会了。但是还贴图。 3,将创建的类引入到...

  • docker 网络配置

    本文主要是介绍docker默认的网络行为,包含创建的默认网络类型以及如何创建用户自定义网络,也会介绍如何在单一主机...

  • 创建控件对象的两种方法

    1.手动代码alloc init创建 2.自定义类,自定义同名的xib,绑定类,loadNibNamed加载,创建...

  • 面向对象 六

    目录 1.元类 1.1 类创建过程 1.2 元类控制类的创建 1.3 元类控制类的创建过程案例 1.4 自定义元...

  • @SentinelResource配置(中)

    客户自定义限流处理逻辑 创建CustomerBlockHandler类用于自定义限流处理逻辑 自定义限流处理类: ...

  • RMI 2019-03-18

    步骤:1.自定义 创建 java interface 类 并且继承 Remote (接口类命名随意) 创建实现类...

  • java多线程

    多线程的实现方式 自定义类继承thread类 重写run()方法,创建自定义类对象,调用start()方法...

网友评论

      本文标题:如何自定义类的创建行为

      本文链接:https://www.haomeiwen.com/subject/vdqsfrtx.html