- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我读过这样的帖子:
但不知何故,我感到困惑。许多困惑,例如:
我何时以及为什么必须执行以下操作?
# 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), {})
super 究竟是如何工作的?
什么是链接 1 中的类注册和取消注册,它是如何工作的? (我认为这与 singleton 有关。我可能是错的,来自 C 背景。我的编码风格仍然是函数式和 OO 的混合体。
类实例化(子类、元类、父类(super class)、类型)和方法调用的流程是什么(
metaclass->__new__, metaclass->__init__, super->__new__, subclass->__init__ inherited from metaclass
) 具有良好注释的工作代码(虽然第一个链接非常接近,但它没有谈论 cls 关键字和 super(..) 和注册表)。最好是多继承的例子。
P.S.:我将最后一部分制作为代码,因为堆栈溢出格式正在转换文本 metaclass->__new__
到元类->新
最佳答案
好的,您已经在这里混合了很多概念!我将提出您提出的一些具体问题。
一般来说,理解 super、MRO 和 metaclasses 变得更加复杂,因为在 Python 的最后几个版本中这个棘手的领域发生了很多变化。
Python's own documentation是一个很好的引用,并且完全是最新的。有一个IBM developerWorks article这很好作为介绍,并采用更多基于教程的方法,但请注意,它已有五年历史,并且花了很多时间谈论元类的旧式方法。
super
是您访问对象父类(super class)的方式。它比(例如)Java 的 super
关键字更复杂,主要是因为 Python 中的多重继承。如Super Considered Harmful解释说,使用 super()
会导致您隐式使用父类(super class)链,其顺序由 Method Resolution Order 定义。 (MRO)。
您可以通过在类(而不是实例)上调用 mro()
轻松查看类的 MRO。请注意,元类不在对象的父类(super class)层次结构中。
A metaclass is the class of a class.Like a class defines how an instanceof the class behaves, a metaclassdefines how a class behaves. A classis an instance of a metaclass.
在你给出的例子中,发生了什么:
正在调用 __new__
冒泡到下一件事维修保养在这种情况下,super(MyType, cls)
将解析为 type
;调用 type.__new__
让 Python完成它的正常实例创建步骤。
这个例子使用了元类强制执行单例。他是覆盖 __call__
在元类,这样每当一个类创建实例,他拦截那,并且可以绕过实例如果已经有一个,则创建(存储在 cls.instance
中)。笔记覆盖 __new__
在元类还不够好,因为那只在什么时候被调用创建类。覆盖类上的 __new__
会起作用,但是。
这显示了一种动态的方法创建一个类。这是他附加提供的类的名称到创建的类名,和将其添加到类层次结构中也是。
我不确定您要查找的代码示例,但这里有一个简短的示例,展示了元类、继承和方法解析:
print('>>> # Defining classes:')
class MyMeta(type):
def __new__(cls, name, bases, dct):
print("meta: creating %s %s" % (name, bases))
return type.__new__(cls, name, bases, dct)
def meta_meth(cls):
print("MyMeta.meta_meth")
__repr__ = lambda c: c.__name__
class A(metaclass=MyMeta):
def __init__(self):
super(A, self).__init__()
print("A init")
def meth(self):
print("A.meth")
class B(metaclass=MyMeta):
def __init__(self):
super(B, self).__init__()
print("B init")
def meth(self):
print("B.meth")
class C(A, B, metaclass=MyMeta):
def __init__(self):
super(C, self).__init__()
print("C init")
print('>>> c_obj = C()')
c_obj = C()
print('>>> c_obj.meth()')
c_obj.meth()
print('>>> C.meta_meth()')
C.meta_meth()
print('>>> c_obj.meta_meth()')
c_obj.meta_meth()
示例输出(使用 Python >= 3.6):
>>> # Defining classes:
meta: creating A ()
meta: creating B ()
meta: creating C (A, B)
>>> c_obj = C()
B init
A init
C init
>>> c_obj.meth()
A.meth
>>> C.meta_meth()
MyMeta.meta_meth
>>> c_obj.meta_meth()
Traceback (most recent call last):
File "metatest.py", line 41, in <module>
c_obj.meta_meth()
AttributeError: 'C' object has no attribute 'meta_meth'
关于python - "MetaClass"、 "__new__"、 "cls"和 "super"- 究竟是什么机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/395982/
尝试使用类创建 GUI,但我一直遇到此错误的问题。我不确定这意味着什么,因为据我所知我只有一节课,我的错误是: Traceback (most recent call last): File "C:/
我在书中遇到过以下 groovy 脚本代码。它给我带来了一些奇怪的输出。 class Person{ def work(){ println "work()" } def spor
如果我向类添加元方法,我希望它显示在 Class.metaClass.metaMethods 中。 .但情况似乎并非如此。特别是,如果我这样做: class Example { def rea
我想知道为什么使用两个不同的类,而不是只对两者都使用 Class 的原因。 最佳答案 简短的回答是“您认为类是系统范围类的实例是错误的,每个类实际上都是类特定元类的实例”,而且“它不会以任何其他方式工
以下代码是具有一个简单表的 SqlAlchemy ORM 的非常简单的实现。 Mytable 类试图从 BaseAbstract 继承。 代码抛出以下异常: Message: metaclass co
译注:这是一篇在Stack overflow上很热的帖子。提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解。他知道这肯定和自省有关,但仍然觉
我在搜索元类在 python 中的用法时发现了这个问题。这是一个很好的问题和一个很好的答案,See Here .但是当我按照这样的例子进行操作时: class UpperAttrMetaclass(t
我在Grails插件中使用了几种类别。例如。, class Foo { static foo(ClassA a,Object someArg) { ... } static bar(C
我遇到了以下陈述: (Metaclass class) new. "Uses the new of Behavior but throws error because Metaclass class
我正在寻找有关我的这项作业的一些说明。我们应该输入该图的代码(不是询问这里的任何人),但我不明白到底发生了什么。 根据我的研究,我知道所有类都是元类的实例,但我不明白的是对象框架、上下文和图表是否应该
假设我有一个类 class Foo: def __init__(self): pass def meth1(self, *args): do_stuff
我想编写一个程序,它接受一个数字 p 作为输入,并为一个遵循整数算术模 p 的数字生成一个类型构造函数作为输出。 目前为止 def IntegersModP(p): N = type('Inte
def metaclass; class << self; self; end; end 谁能帮我破译这条线。我猜它被挤成一个的事实也无济于事。但是我才 2 天前才开始研究 ruby,我担心我可能
我正在测试 groovy.sql.Sql 元类中的运行时更改,修改 createConnection 方法。我的目标是在请求某些连接时始终调用进程。 是否有更改 protected 方法的限制?我可以
Groovy 和其他 OO 编程语言中的 Meta-Class 有什么用? 最佳答案 您可能会想到 Groovy's MetaClass : A MetaClass within Groovy def
我有以下脚本: task myTask {} class Person { Person() { Person instance = this println
我使用的是 groovy 1.7.8。 我有以下代码: public class StaticClass { public static String getStaticString(Stri
在编写单元测试用例时,有一点我需要做一些元编程来测试如下方法。 void "test method:resolver"(){ setup:"mocked resolver"
我正在使用 django-tastypie 为我的 webapp 创建一个 rest API。我想创建如下所述的类,而不用显式地全部输入它们(我有超过 100 个类) class CityResour
例如,以下不会编译 (link to typescript playground example) : declare class ClassFactory { constructor();
我是一名优秀的程序员,十分优秀!