我读过这样的帖子:
但不知怎的我搞糊涂了。很多困惑比如:
我什么时候,为什么要做这样的事情?
# Refer link1
return super(MyType, cls).__new__(cls, name, bases, newattrs)
或者
# Refer link2
return super(MetaSingleton, cls).__call__(*args, **kw)
或者
# Refer link2
return type(self.__name__ + other.__name__, (self, other), {})
超级到底是怎么工作的?
什么是link1中的类注册和注销,它到底是如何工作的?(我想这和singleton有关。我可能错了,我是C背景的。我的编码风格仍然是函数式和面向对象的混合。
类实例化(子类、元类、超类、类型)和方法调用的流程是什么
metaclass->__new__, metaclass->__init__, super->__new__, subclass->__init__ inherited from metaclass
)使用注释良好的工作代码(尽管第一个链接非常接近,但它不讨论cls关键字和super(..)以及registry)。最好是具有多重继承的示例。
备注:我将最后一部分作为代码,因为堆栈溢出格式正在转换文本metaclass->__new__
到元类->;新建
下面是更务实的答案。
这无关紧要
“What is a metaclass in Python”。总之,
type
是所有类的元类。你这样做几乎没有实际意义。“What are your (concrete) use cases for metaclasses in Python?”。底线。没有。
“Python's Super is nifty, but you can't use it”。有趣的音符,但实用价值不大。您永远不需要解析复杂的多重继承网络。通过使用显式策略设计而不是多重继承,很容易防止出现此问题。
以下是我在过去7年的Python编程经验。
一个类有一个或多个超类,形成从我的类到
object
的简单链。“类”的概念由名为
type
的元类定义。我可能想扩展“类”的概念,但到目前为止,它还没有在实践中出现。一次也没有。type
总是做正确的事情。使用
super
在实践中效果非常好。它允许一个子类服从它的超类。它碰巧出现在这些元类示例中,因为它们正在扩展内置元类type
。然而,在所有子类的情况下,您将使用
super
来扩展超类。元类
元类问题是:
每个对象都有对其类型定义或“类”的引用。
class
本身也是一个对象。因此,
class
类型的对象具有对其类型或“类”的引用。“类”的“类”是一个元类。因为“类”不是C++运行时对象,所以C++中没有发生这种情况。它确实发生在Java、Smalltalk和Python中。
元类定义类对象的行为。
与类的交互90%是要求类创建一个新对象。
我发现了一些类级方法的用例。我几乎没有类变量的用例。我从来没有机会改变对象构造的工作方式。
好吧,你已经把一些概念混为一谈了!我要问你几个具体的问题。
一般来说,理解super、MRO和metclasses要复杂得多,因为在Python的最后几个版本中,这个棘手的领域发生了很多变化。
Python's own documentation是一个非常好的参考,并且完全是最新的。有一个IBM developerWorks article可以作为一个介绍,它采用了一种更基于教程的方法,但是请注意,它已经有5年的历史了,并且花了很多时间讨论元类的老式方法。
super
是访问对象的超级类的方式。它比(例如)Java的super
关键字更复杂,这主要是由于Python中的多重继承。正如Super Considered Harmful所解释的,使用super()
可能会导致隐式地使用超级类链,其顺序由Method Resolution Order(MRO)定义。通过调用类(而不是实例)上的
mro()
,可以很容易地看到类的MRO。注意,元类不在对象的超类层次结构中。Thomas元类的描述here非常好:
在您给出的示例中,下面是发生的情况:
正在调用
__new__
冒泡到 先生。在这种情况下,super(MyType, cls)
将解析为type
; 调用type.__new__
让Python 完成这是正常情况 创建步骤。这个例子使用的是元类 强制执行一个单子。他是 重写中的
__call__
元类,以便每当类 实例被创建,他拦截 可以绕过实例 如果已经有一个 (存储在cls.instance
中)。注意 在 元类不够好, 因为只有在 创建类。超越__new__
在类上可以工作, 然而。这显示了一种动态地 创建类。他来了 附加提供的类的名称 到创建的类名,以及 将其添加到类层次结构中 我也是。
我不确定您要查找的是哪种类型的代码示例,但这里有一个简短的示例,显示了元类、继承和方法解析:
相关问题 更多 >
编程相关推荐