码迷,mamicode.com
首页 > Web开发 > 详细

metaclass简单使用

时间:2019-12-15 14:41:17      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:调用   __init__   基类   tac   简单   rgs   turn   自定义   ret   

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简单使用

标签:调用   __init__   基类   tac   简单   rgs   turn   自定义   ret   

原文地址:https://www.cnblogs.com/z-qinfeng/p/12043750.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!