首页 > 编程语言 >在Python中,元类是什么?

在Python中,元类是什么?

时间:2023-10-07 20:58:03浏览次数:47  
标签:__ Python 什么 class 元类 type self

内容来自 DOC https://q.houxu6.top/?s=在Python中,元类是什么?

什么是元类(metaclasses)?它们用于什么目的?

元类是Python中的一种高级概念,它们是创建类的类。在Python中,类也是对象,因此它们也可以被看作是对象的模板。元类允许您控制类的创建过程,例如修改类的属性或方法,或者添加新的属性和方法。

元类通常用于以下目的:

  • 动态地创建类。您可以使用元类在运行时创建新的类,而不是在编写代码时静态地定义它们。
  • 修改类的行为。您可以使用元类来修改类的行为,例如添加新的属性或方法,或者修改现有属性或方法的行为。
  • 实现插件系统。您可以使用元类来实现插件系统,这样您就可以在不修改现有代码的情况下向应用程序添加新功能。

元类是类的类。类定义了类的实例(即对象)的行为,而元类定义了类的行为。类是元类的实例。

虽然在Python中可以使用任意可调用对象作为元类(如Jerub所示),但更好的方法是将其本身变成一个实际的类。type是Python中通常的元类。type本身就是一个类,它是它自己的类型。您无法完全用Python重新创建类似type的东西,但Python有点作弊。要在Python中创建自己的元类,您真正想要做的只是继承type

元类最常用于类工厂。当您通过调用类来创建对象时,Python会在执行'class'语句时通过调用元类来创建一个新的类。与正常的__init____new__方法结合使用,元类因此允许在创建类时执行“额外的事情”,例如将新类注册到某些注册表中或将类替换为完全不同的东西。

当执行'class'语句时,Python首先将'class'语句的主体作为常规代码块执行。结果命名空间(字典)包含要创建的类的属性。元类是通过查看要创建的类的基类(元类是继承的)、要创建的类的__metaclass__属性(如果有)或__metaclass__全局变量来确定的。然后,使用要实例化的类的名称、基类和属性调用元类。

然而,元类实际上定义了一个type的类,而不仅仅是它的工厂,因此您可以使用它们做更多的事情。例如,您可以在元类上定义普通方法。这些元类方法类似于类方法,可以在没有实例的情况下调用类,但它们也不像类方法那样可以在类的实例上调用。type.__subclasses__()type元类上的一个方法示例。您还可以定义普通的“魔术”方法,例如__add____iter____getattr__,以实现或更改类的行为。

以下是一些零碎的例子:

def make_hook(f):
    """装饰器将'foo'方法变成'_\_foo\_\_'"""
    f.is_hook = 1
    return f

class MyType(type):
    def __new__(mcls, name, bases, attrs):

        if name.startswith('None'):
            return None

        # 遍历属性,看看它们是否应该被重命名。
        newattrs = {}
        for attrname, attrvalue in attrs.items():
            if getattr(attrvalue, 'is_hook', 0):
                newattrs['_\_%s\_\_' % attrname] = attrvalue
            else:
                newattrs[attrname] = attrvalue

        return super(MyType, mcls).__new__(mcls, name, bases, newattrs)

    def __init__(self, name, bases, attrs):
        super(MyType, self).__init__(name, bases, attrs)

        # classregistry.register(self, self.interfaces)
        print("Would register class %s now." % self)

    def __add__(self, other):
        class AutoClass(self, other):
            pass
        return AutoClass
        # 或者,自动生成类名以及类:
        # return type(self._\_name\_\_ + other._\_name\_\_, (self, other), {})

    def unregister(self):
        # classregistry.unregister(self)
        print("Would unregister class %s now." % self)

class MyObject:
    __metaclass__ = MyType

class NoneSample(MyObject):
    pass

# 将打印 "NoneType None"
print(type(NoneSample), repr(NoneSample))

class Example(MyObject):
    def __init__(self, value):
        self.value = value
 @make_hook
    def add(self, other):
        return self.__class__(self.value + other.value)

# 将取消注册类
Example.unregister()

inst = Example(10)
# 将引发AttributeError错误
#inst.unregister()

print(inst + inst)
class Sibling(MyObject):
    pass

ExampleSibling = Example + Sibling
# ExampleSibling现在是Example和Sibling的子类(没有自己的内容)
# 尽管它会认为它被称为'AutoClass'
print(ExampleSibling)
print(ExampleSibling.__mro__)

标签:__,Python,什么,class,元类,type,self
From: https://www.cnblogs.com/xiaomandujia/p/17747452.html

相关文章

  • 【Azure Function App】Python Function调用Powershell脚本在Azure上执行失败的案例
    问题描述编写PythonFunction,并且在Function中通过 subprocess 调用powershell.exe执行powershell脚本。importazure.functionsasfuncimportloggingimportsubprocessapp=func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)defrun(cmd):completed......
  • 而立之年,做什么好呢?
    疫情让很多人的生活方式发生了改变,不仅仅是让大家的身心健康受到了极大的冲击,连思维方式都发生了巨大的变化。国际环境不乐观,外贸不振,中华之崛起遇到了西方世界的极大阻碍;国内房地产经济进入低谷期,广大人民群众都开始了消费降级。相对于某京和某宝市场份额的大幅下降,某多的强势崛起......
  • 【Azure Function App】Python Function调用Powershell脚本在Azure上执行失败的案例
    问题描述编写PythonFunction,并且在Function中通过 subprocess 调用powershell.exe执行powershell脚本。importazure.functionsasfuncimportloggingimportsubprocessapp=func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)defrun(cmd):compl......
  • python过滤以#;//号开头的行注释行 startswith()
    作用:过滤指定符号开头的行(过滤注释行)Pythonstartswith()方法用于检查字符串是否是以指定子字符串开头,如果是则返回True,否则返回False。如果参数beg和end指定值,则在指定范围内检查。方法(函数):str.startswith(substr,beg=0,end=len(string));参数:str--......
  • python28days
    面向过程编程面向对象编程类的定义和对象的产生定制对象自己独有的属性属性的查找顺序(类属性,对象属性)—————————————————————————————————————————————————————————————在编程中,面向过程和面向对象是编程的两大......
  • Python 图片管理工具介绍(筛像素+从文件夹取出图片并放到文件夹内+excel读取)
    功能介绍:这是一个Python脚本工具,用于批量管理和复制图片。其主要功能如下:从Excel表格读取数据:程序使用openpyxl库从Excel文件中读取数据,其中A列包含源图片的路径(可以有多个路径,用逗号分隔),B列包含目标目录。图片筛选:仅复制最小维度大于800像素的图片,这可以确保目标目录中的......
  • Python3.12 新特性——GIL 重大突破!
    Python3.12新特性2023年10月2日,Python3.12正式发布了,和之前版本相比,Python3.12有比较大的更新,核心最主要的就是能够支持解释器之间的隔离了,在一个Python进程当中能够有多个解释器,这在一定程度上缓解了GIL带来的问题,在这个版本当中主要有下面的一些主要的新特性:更灵......
  • 什么是站内搜索引擎?如何在网站中加入站内搜索功能?
    在当今数字时代,用户体验对于网站的成功起着至关重要的作用。提升用户体验和改善整体网站性能的一种方法是引入站内搜索引擎。站内搜索引擎是一种强大的工具,它的功能类似于Google或Bing等流行搜索引擎,但它专注于实施自己网站上的内容。用户可以在网站内搜索特定内容,无需手动浏览网站......
  • 螺杆支撑座有什么优势?
    螺杆支撑座是机械设备中重要的支撑部件,其主要作用是支撑和固定螺杆,以确保机械设备的正常运行。以下是螺杆支撑座的使用优势:1、支撑稳定:螺杆支撑座采用高品质钢材制作而成,具有较高的强度和刚度,能够为螺杆提供可靠的支撑,有效避免了螺杆在运转过程中出现的弯曲和扭曲现象。2、定位准确......
  • Python标准库分享之文件管理 (部分os包,shutil包)
    在操作系统下,用户可以通过操作系统的命令来管理文件,参考linux文件管理相关命令。Python标准库则允许我们从Python内部管理文件。相同的目的,我们有了两条途径。尽管在Python调用标准库的方式不如操作系统命令直接,但有它自己的优势。你可以利用Python语言,并发挥其他Python工具,形成组......