自定义元类和元类的用途
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)的理解和简单运用