当前位置: 首页 > 面试题库 >

python-什么是Python中的元类?

拓拔骁
2023-03-14
问题内容

元类是什么,我们将它们用于什么?


问题答案:

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

虽然在Python中你可以对元类使用任意可调用对象(例如Jerub演示),但是更好的方法是使其成为实际的类。type是Python中常见的元类。type它本身是一个类,并且是它自己的类型。你将无法type纯粹使用Python 重新创建类似的东西,但是Python有点作弊。要在Python中创建自己的元类,你实际上只想将其子类化type

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

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

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

这是一些细节的汇总示例:

def make_hook(f):
    """Decorator to turn 'foo' method into '__foo__'"""
    f.is_hook = 1
    return f

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

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

        # Go over attributes and see if they should be renamed.
        newattrs = {}
        for attrname, attrvalue in attrs.iteritems():
            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
        # Alternatively, to autogenerate the classname as well as the class:
        # 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

# Will print "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)

# Will unregister the class
Example.unregister()

inst = Example(10)
# Will fail with an AttributeError
#inst.unregister()

print inst + inst
class Sibling(MyObject):
    pass

ExampleSibling = Example + Sibling
# ExampleSibling is now a subclass of both Example and Sibling (with no
# content of its own) although it will believe it's called 'AutoClass'
print ExampleSibling
print ExampleSibling.__mro__


 类似资料:
  • 问题内容: 在Python中,什么是元类?我们将它们用于什么? 问题答案: 元类是类的类。类定义类的实例(即对象)的行为,而元类定义类的行为。类是元类的实例。 尽管在Python中您可以对元类使用任意可调用对象(例如Jerub演示),但是更好的方法是使其成为实际的类。type是Python中常见的元类。type它本身是一个类,并且是它自己的类型。您将无法type纯粹在Python中重新创建类似的内

  • rank ▲ ✰ vote url 2 1919 1842 3137 url Python中的元类(metaclass)是什么? 元类是什么?如何使用元类? 类对象 在理解元类之前,你需要掌握Python里的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特. 在大多数语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立: >>> class Obje

  • 问题内容: 我以前从未听说过命名元组,并且我认为元素可以用数字(如在元组和列表中)或键(如字典中)进行索引。我从未想到它们可以同时被索引。 因此,我的问题是: 什么叫元组? 如何使用它们? 为什么/何时应该使用命名元组而不是普通元组? 为什么/何时应该使用普通元组而不是命名元组? 是否有某种“命名列表”(命名元组的可变版本)? 问题答案: 命名元组基本上是易于创建的轻量级对象类型。可以使用类对象变

  • 问题内容: 第3、16、17、18和19行用*突出显示的含义是什么。有人可以解释他们的工作吗?我是python和编程新手 问题答案: 此代码中只有三行用*突出显示,但这是它们的含义: 第一行: 这是在声明 后面 的函数( test_Iframe 和 tearDown )的 类* 。在面向对象的编程中,使用一个类来创建“对象” 。可以将 类 视为数据/过程的抽象,而 对象 是类的特定实例。 ***

  • 问题内容: 我总是像这样阅读代码来计算时间: 您能在这里解释什么是“%”吗? 我认为,“%”总是用于替换字符串中的某些内容,例如%s表示替换字符串,%d替换数据,但是我不知道这种情况。 问题答案: 是ipython的魔术函数,可用于计时特定代码段(单个执行语句或单个方法)。 从文档: %timeit 要使用它,例如,如果我们想确定using是否比using更快,则只需执行以下操作: 您将获得他们的

  • 本文向大家介绍python中的iterweekdays()是什么?,包括了python中的iterweekdays()是什么?的使用技巧和注意事项,需要的朋友参考一下 iterweekdays()方法。该方法返回将用于一周的工作日数字的迭代器。 示例 输出结果 要么 输出结果