【问题标题】:How are Python metaclasses different from regular class inheritance? [duplicate]Python 元类与常规类继承有何不同? [复制]
【发布时间】:2013-10-28 02:52:38
【问题描述】:

这可能是一个开放式问题,但我刚刚学习 Python 中的元类,我不明白元类与仅从父类继承子类有何不同,例如

class child(parent):

这不是和元类有同样的目的吗?我想也许我不明白元类的目的。

【问题讨论】:

  • 这是怎么复制的?我不是在问“什么是元类”,我已经阅读了几次该线程。
  • 正如我的问题所述,我特意询问元类和从父类继承的子类之间有什么区别。
  • 您所问的是该问题中所问问题的一个子集,如果您阅读并理解了该问题的答案,您就会明白您所问的差异。

标签: python metaclass


【解决方案1】:

不同的是,从类继承不影响的创建方式,它只影响类的实例的创建方式。如果你这样做:

class A(object):
    # stuff

class B(A):
    # stuff

那么在创建 B 时,A 没有任何机会“挂钩”。 A 的方法可以在创建 B 的实例时调用,但不能在创建类 B 本身时调用。

元类允许您在创建类时定义自定义行为。有关元类如何工作的示例,请参阅我标记为重复的问题,并说服自己在这些示例中存在您无法通过正常继承实现的效果。

【讨论】:

  • 尝试在 youtube 上寻找视频教程,这可能会更有帮助。
  • @BrenBarn,这是最好的一个班轮答案。谢谢!
【解决方案2】:
class AccessorType(type):
    def __init__(self, name, bases, d):
        type.__init__(self, name, bases, d)
        accessors = {}
        prefixs = ["get_", "set_", "del_"]

        for k in d.keys():
            v = getattr(self, k)
            for i in range(3):
                if k.startswith(prefixs[i]):
                    accessors.setdefault(k[4:], [None, None, None])[i] = v

        for name, (getter, setter, deler) in accessors.items():
            # create default behaviours for the property - if we leave
            # the getter as None we won't be able to getattr, etc..
            # [...] some code that implements the above comment
            setattr(self, name, property(getter, setter, deler, ""))

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多