自定义元类和元类的用途

Posted zhoulixiansen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义元类和元类的用途相关的知识,希望对你有一定的参考价值。

# -*- coding:UTF-8 -*-
__autor__ = zhouli
__date__ = 2018/12/3 23:13


def create_class(name):
    if name == "user":
        class User:
            def __str__(self):
                return "user"

        return User  # 这一步很关键一定要把类给return回去
    elif name == "company":
        class Company:
            def __str__(self):
                return "company"

        return Company


if __name__ == "__main__":
    MyClass = create_class("user")
    my_obj = MyClass()
    print(my_obj)

结果是user,这个就是动态的创建出来的类。

不过在此做一个补充说明:很多人不明白为什么使用

if __name__ == "__main__":

因为这样会保证这个脚本被调用时候不会被自动执行

但这样动态的创建类也不是太灵活,那就可以采用type类了

type一般用来获取某一个对象的类型的,第二点就是type可以用来创建类的

如何动态的创建类呢?

# -*- coding:UTF-8 -*-
__autor__ = zhouli
__date__ = 2018/12/3 23:25
# type动态创建类
#  User = type("User", (), {})
# 第一个参数传递的是类的名称,第二个参数是继承的基类,不继承直接写个空元祖,第三个参数是传入属性,不写传一个空字典


if __name__=="__main__":
    User = type("User", (), {})
    my_obj = User()
    print(my_obj)
"""
<__main__.User object at 0x025A4A50>
"""

为User添加属性

if __name__=="__main__":
    User = type("User", (), {"name":"user"})
    my_obj = User()
    print(my_obj.name)
"""
user
"""

这个就和

# -*- coding:UTF-8 -*-
__autor__ = zhouli
__date__ = 2018/12/3 23:13


def create_class(name):
    if name == "user":
        class User:
            name = "user"

            def __str__(self):
                return "user"

        return User  # 这一步很关键一定要把类给return回去
    elif name == "company":
        class Company:
            def __str__(self):
                return "company"

        return Company


if __name__ == "__main__":
    MyClass = create_class("user")
    my_obj = MyClass()
    print(my_obj.name)

技术分享图片是一样的了

但是我们创建类的时候不仅仅有类的属性,实际还有类的方法,那如何定义呢?

很简单:定义一个函数,记住参数一定要是self:

def say(self):
    return "i am user"
    # return self.name

然后在属性中加入{"say": say}

完整如下:

def say(self):
    # return "i am user"
    return self.name + test


if __name__ == "__main__":
    User = type("User", (), {"name": "user", "say": say})  # 是函数的名称,不是调用,不要加()
    my_obj = User()
    print(my_obj.say())
"""
usertest
"""

那如果User需要继承一个基类呢?

class BaseClass:
    def answer(self):
        return ****


if __name__ == "__main__":
    User = type("User", (BaseClass,), {"name": "user", "say": say})  # 是函数的名称,不是调用,不要加()
    my_obj = User()
    print(my_obj.answer())
"""
****
"""

别忘了元祖后的一个逗号

那什么才是元类?

元类是创建类的类

编码时很少会采用type创建类,一般使用MetaClass(type)类名可以自定义,但继承type了他就是元类了

class MetaClass(type):
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls, *args, **kwargs)


from collections.abc import *


# 什么是元类, 元类是创建类的类 对象<-class(对象)<-type
class User(metaclass=MetaClass):  # 指定控制实例化过程的元类
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "user"


# python中类的实例化过程,会首先寻找metaclass,通过metaclass去创建user类
# 去创建类对象,实例

类什么也不继承的时候,type会去创建类对象,实例。

 

那么元类到底有什么作用呢?

例:自定义ORM

 

以上是关于自定义元类和元类的用途的主要内容,如果未能解决你的问题,请参考以下文章

类和元类

旧式类、新式类和元类

参数化类和元类有啥区别(请使用 Python 中的代码示例)?

Python学习 Day14 python 类和元类(metaclass)的理解和简单运用

python 类和元类(metaclass)的理解和简单运用

使用 python 元类和继承的问题