zoukankan      html  css  js  c++  java
  • python中的元类metaclass

    这个非常的不常用,但是像ORM这种复杂的结构还是会需要的,详情请看:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python

    元类最常用作类工厂。当通过调用类创建对象时,Python通过调用元类来创建一个新类(当执行“ class”语句时)。因此,将元类与常规方法__init____new__方法结合使用,可以使您在创建类时做“额外的事情”,例如在某些注册表中注册新类或将其完全替换为其他类。

    class执行语句时,Python首先将class语句的主体作为普通代码块执行。生成的名称空间(一个dict)保存了将来类的属性。通过查看要成为类的基类(继承了元类),要成为__metaclass__的类(如果有)属性或__metaclass__全局变量来确定元类。然后使用该类的名称,基数和属性调用该元类以实例化它。

    但是,元类实际上定义了类的类型,而不仅仅是它的工厂,因此您可以使用它们做更多的事情。例如,您可以在元类上定义常规方法。这些元类方法就像类方法,因为它们可以在没有实例的情况下在类上调用,但是它们也不像类方法,因为它们不能在类的实例上被调用。type.__subclasses__()type元类上方法的示例您还可以定义正常的“魔力”的方法,如__add____iter____getattr__,执行或更改类的行为。

    类是用来定义对象的,那么元类是什么? 

    • 元类是一种,创建,修改类的一种技术(通俗地说他是一个类管理员)

    • 添加,删除类的属性以及方法

    class CreateClass(type):
        def __new__(cls, classname, superclass, params_dict):
            # 操作我们的类的属性
            del params_dict['num']
            del params_dict['set_name']# 删除类的属性和方法
            params_dict['my_num'] = 20000
    
            return super().__new__(cls, classname, superclass, params_dict)
    
    
    # 让我们的student类的创建让我们的createclass创建
    class Student(object, metaclass=CreateClass):
        num = 100
        def __init__(self):
            self.name = None
        def set_name(self, name):
            self.name = name
    
    
    student = Student()
    student.set_name('name')
    print(student.my_num)
    >Traceback (most recent call last): 
    >student.set_name('name') > AttributeError: 'Student' object has no attribute 'set_name'

    元类可以创建类

     class A(object):
         passa = A()
         print(a.__class__) 
         print(a.__class__.__class__)
         print(a.__class__.__class__.__class__)
         
         
         # A
         # type
         # type
     
  • 相关阅读:
    SQLite打开提示database disk image is malformed
    windows查看端口占用
    新浪SAE使用Thinkphp框架,禁用memcache节省豆子的方法
    Realtek 8168 安装 VMware ESXi 提示没有驱动
    13年国庆彩蛋
    Flex使用宋体渲染越南语显示错误
    微信 编码要UTF8
    WeiXin 验证成为开发者和更换服务器验证代码
    测试网络连通情况
    废弃sqlite代码,备查
  • 原文地址:https://www.cnblogs.com/originalTblog/p/11726273.html
Copyright © 2011-2022 走看看