首页 > 编程语言 >Python面向对象原理分析-元类MetaClass

Python面向对象原理分析-元类MetaClass

时间:2022-12-31 23:12:02浏览次数:53  
标签:__ Python object 元类 MyType new Foo MetaClass cls

metaclass元类

1.前戏

对象是类实例化的结果

class Foo(object):
    pass

# 第1步:调用Foo的__new__方法创建空对象。
# 第2步:调用Foo的__init__方法对对象进行初始化。
obj = Foo()

类在默认情况下是由type创建出来的

class Foo(object):
    v1 = 123
    
    def func(self):
        return 69
Foo = type("Foo",(object,),{"v1":123,"func":lambda self:69})

这两种情况创建类,是完全等价的

2. metaclass

在定义类时加入metaclass指定当前类的创造者

默认情况下,metaclass=type

# 由type创建Foo类型
class Foo(object):
    pass
# 由MyType创建Foo类型
class Foo(object,metaclass=MyType):
    pass

2.1 指定元类(metaclass)来创建类

class MyType(type):
    def __init__(cls, *args, **kwargs):
        print("第2步:初始化类成员:", args, **kwargs)
        super().__init__(*args, **kwargs)

    def __new__(cls, *args, **kwargs):
        new_cls = super().__new__(cls, *args, **kwargs)
        print("第1步:创建类:", new_cls)
        return new_cls

    def __call__(cls, *args, **kwargs):
        print("第3步:创建对象&初始化对象", cls)

        # 1.调用自己那个类的 __new__ 方法去创建对象
        new_object = cls.__new__(cls, *args, **kwargs)

        # 2.调用你自己那个类 __init__放发去初始化
        cls.__init__(new_object, *args, **kwargs)
        return new_object


class Foo(metaclass=MyType):
    v1 = 123

    def func(self):
        pass


obj = Foo()

2.2 在MyType元类中自定义类变量

class MyType(type):
    def __new__(cls, name, bases, attrs):
        # print(name, bases, attrs)
        del attrs['v1']
        attrs['dex'] = "xxxx"
        xx = super().__new__(cls, name, bases, attrs)
        return xx


# Foo = MyType("Foo", (object,), {"v1": 123, "func": lambda self: 999})
class Foo(object, metaclass=MyType):
    v1 = 123

    def func(self):
        pass


print(Foo.func)
print(Foo.dex)

元类在DjangoRestframework序列化器有应用。

标签:__,Python,object,元类,MyType,new,Foo,MetaClass,cls
From: https://www.cnblogs.com/uichuan/p/17017542.html

相关文章

  • Python之路【第六篇】:socket
    1.Socketsocket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。socket起源于Unix,而Unix/Lin......
  • Python爬虫学习经历
    requests模块1.处理一个UA反爬importrequestscontent=input("请输入你要搜索的内容:")url=f"https://www.sogou.com/web?query={content}"headers={#添加......
  • 掌握Python中列表生成式的五个原因
    1.引言在Python中我们往往使用列表生成式来代替for循环,本文通过引入实际例子,来阐述这背后的原因。闲话少说,我们直接开始吧!2.简洁性列表生成式允许我们在一行代码中创建一......
  • Python__19--函数调用的参数传递与变量的作用域
    1函数调用的参数传递形参(形式参数):在函数定义的时候用到的参数没有具体值,只是一个占位的符号,成为形参;实参(实际参数):在调用函数的时候输入的值。实际参数和形式参......
  • pycharm配置python环境
    打开pycharm,找到settings中的pythoninterpreter点击addinterpreter,addlocalinterpreter选择python安装路径就可以了......
  • python中字典介绍
    #字典学习可变容器模型#创建字典的字面量语法scores={'刘德华':95,'白元芳':78,'狄仁杰':82}print(scores)#{'刘德华':95,'白元芳':78,'狄仁杰':82}......
  • FOFA-Python-SDK使用说明
    FOFASDK使用说明文档FOFAAPIFOFAAPI是资产搜索引擎FOFA为开发者提供的RESTfulAPI接口,允许开发者在自己的项目中集成FOFA的功能。FOFASDK基于FOFAAPI......
  • 极客编程python入门-操作文件和目录
    操作文件和目录Python内置的os模块也可以直接调用操作系统提供的接口函数。>>>importos>>>os.name#操作系统类型'posix'如果是​​posix​​,说明系统是​​Linux​​、......
  • python中元组的介绍
    ###使用元组#原则与列表类似,是一种容器数据类型#定义元组t=('骆昊',30,True,'武汉')print(t)#获取元组中的元素print(t[0])#遍历元组中的值formemberint:......
  • python字符串练习
    a,b=5,10print('{0}*{1}={2}'.format(a,b,a*b))#5*10=50aa,bb=5,20print(f'{aa}*{bb}={aa*bb}')#5*20=100#Python列表```list=[1,3,5,7,1......