自定义元类和元类的用途

# -*- 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

原文地址:https://www.cnblogs.com/zhoulixiansen/p/10068456.html

时间: 2024-12-04 19:12:54

自定义元类和元类的用途的相关文章

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

(一) python中的类 首先这里讨论的python类,都基于继承于object的新式类进行讨论. 首先在python中,所有东西都是对象.这句话非常重要要理解元类我要重新来理解一下python中的类 class Trick(object): pass 当python在执行带class语句的时候,会初始化一个类对象放在内存里面.例如这里会初始化一个Trick对象 这个对象(类)自身拥有创建对象(通常我们说的实例,但是在python中还是对象)的能力. 为了方便后续理解,我们可以先尝试一下在新式

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

python 类和元类(metaclass)的理解和简单运用 (一) python中的类 首先这里讨论的python类,都基于继承于object的新式类进行讨论. 首先在python中,所有东西都是对象.这句话非常重要要理解元类我要重新来理解一下python中的类 class Trick(object): pass 当python在执行带class语句的时候,会初始化一个类对象放在内存里面.例如这里会初始化一个Trick对象 这个对象(类)自身拥有创建对象(通常我们说的实例,但是在python中

面向对象,元类,控制类,对象的创建

""" call 调用的意思 ? 在在对象被调用时 执行 函数 类 自定义元类 的目的 ? 1.可以通过call 来控制对象的创建过程 ? 2.可用控制类的创建过程 """ 自定义一个元类 元类也是一个类 但是需要继承type class MyMeta(type):?self 表示要创建对象的那个类(Person) *args是调用Person类时传入的参数??  def __call__(self, *args, **kwargs):??   

通过元类来控制类的产生

通过元类来控制类的产生 自定义元素:来控制类的产生,可以控制类名,可以控制类的继承父类,控制类的名称空间 自定义元类必须继承type,写一个类继承type 这种类都叫元类 class Mymeta(type): # def __init__(self,*args,**kwargs): def __init__(self,name,bases,dic): # self 就是Person类 print(name) print(bases) print(dic) #练习一:加限制 控制类名必须以sb开

类和元类

声明 本文译自class and metaclasses.非原创 类和元类十个鸡生蛋,蛋生鸡的混沌逻辑 正文 Objective-C是一中类基础的对象系统.每一个类都是类的实例;对象的isa指针指向它所属的类.类描述了对象的数据:分配的大小和实例变量类型以及布局形式.类也定义了对象的行为:选择器去应答实现的实例方法. 类的方法列表是一簇实例方法,对象可以应答的选择器.当你给一下实例发送消息,objc_msgSend()检索对象的类(或父类)的方法列表决定调用哪个方法. 每个类也是一个对象.它有一

第十三章、元类之控制类的调用过程

目录 第十三章.元类之控制类的调用过程 一.__call__ 第十三章.元类之控制类的调用过程 一.__call__ 作用:控制类的调用过程,实际上在控制:对象的产生 控制名称空间 class Mymeta(type): def __call__(self,*args, **kwargs): obj=self.__new__(self)#生成空对象 obj.__init__(*args, **kwargs)#调用obj的__init__() obj.__dict__['attr']=kwargs

java自定义Annotation,得到注解类中Annotation设定的注解值

java注解机制在各大框架中应用普遍,注解中可以设置一些值,如何得到呢. 要得到注解类中Annotation设定的注解值 即:遍历自定义Annotation中的方法,反射执行方法,结果就是 对应的注解值. java代码例子: package com.doctor.spring.core; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotat

2、函数内部属性 arguments是类数组对象,主要用途是保存函数参数,但这个对象中有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数

例如:(1).function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }//此时是递归算法 var trueFactorial=factorial;//将factorial复制给trueFactorial factorial=function(){ return 0; }//覆盖factorial函数 alert(trueFactorial(5));//0;因为辞职factorial

自定义的一个数据输入类

package xinhuiji_day07; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.text.SimpleDateFormat;import java.util.Date; public class InputData {    private BufferedReader buf = null;    public InputD