metaclass简单使用
Posted z-qinfeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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="小马")
以上是关于metaclass简单使用的主要内容,如果未能解决你的问题,请参考以下文章
重写构造函数中调用的方法时,Groovy metaClass 失败?