• metaclass简单使用


    metaclass : 元类, 就是创建python类对象的类

    # 便用type动态创建类
    
    # 1. 使用type创建一个User类对象  无基类,无属性 . () : 表示基类,  {}:属性
    User = type('User', (), {})
    user = User()
    print(user)  # <class '__main__.User'>
    
    # 2. 创建一个user对象,且带有一个name属性
    
    User = type('User', (), {'name': '小强'})
    user = User()
    print(user.name)  # 小强
    
    
    # 3. 创建一个user对象,且带有一个name属性 和一个say方法
    
    def say(self):  # 这里一定要加个self, 否则报错
        return 'i am say'
    
    
    User = type('User', (), {'name': '小强', 'say': say})
    user = User()
    print(user.say())  # i am say
    
    
    # 4. 创建一个User类,且还有个基类
    
    
    class BaseUser:
        def kk(self):
            return 'i am base class'
    
    User = type('User', (BaseUser,), {'name': '小强'})
    user = User()
    print(user.kk())  # i am base class
    
    # 5. 元类,创建类的类
    # 自定义一个元类,. 继承type即可
    class MetaClass(type):
        def __new__(cls, *args, **kwargs):
            print('invoke MetaClass __new__')
            return super().__new__(cls,*args, **kwargs)
    
    # 这样子会通过MetaClass创建User类对象, 如果找不到metaclass ,就是调用内置的type创建User类对象
    class User(metaclass=MetaClass):
        """
            User类继承了metaclass,那么就相当于将__new__这个方法委托给了metaclass
        """
    
        def __init__(self,name):
            self.name = name
        def __str__(self):
            return self.name
    
    # 实例化一个user对象时,会先调用MetaClass的__new__方法,再调用User类的__init__
    user = User(name="小马")
  • 相关阅读:
    某题3
    无向图Tarjan&&求树直径
    分布式消息中间件(一)设计
    大数据算法(一)亚线性算法
    SparkSQL
    MySQL索引
    Spark程序设计
    Java高并发网络编程(五)Netty应用
    Java高并发网络编程(四)Netty
    Java高并发网络编程(三)NIO
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/12043750.html
Copyright © 2020-2023  润新知