在 python 中使用类型类创建类型类

Posted

技术标签:

【中文标题】在 python 中使用类型类创建类型类【英文标题】:Creating a type class using type class in python 【发布时间】:2012-06-27 04:10:35 【问题描述】:

我正在阅读这篇关于元类What is a metaclass in Python? 的有趣帖子。接受的答案显示了如何使用具有以下签名的类型创建一个类。

type(类名, 父类的元组(用于继承,可以为空), 包含属性名称和值的字典)

我尝试使用上面的签名创建“类型”类,我很惊讶我一开始就被允许创建一个!感谢您的意见!

type = type('type',(),);

其次,在我使用上面的语法创建了一个类型类之后,我无法做到

myclass = type('myclass',(),); 

type = type('type',(),);

我收到一个错误提示

Traceback(最近一次调用最后一次):文件“”,第 1 行,in TypeError: object.new() 没有参数

但是,当我尝试以下操作时,我可以成功。

class myclass(object):
    pass

我很困惑,因为根据我的理解,上面的 sn-p 应该调用 type 来尝试创建类“myclass”。发生什么了!?我错过了一些细节吗?

【问题讨论】:

为了记录,这里用来指代元类的类型类是用词不当; type classes 是 Haskell 和 Scala 等函数式编程语言中广泛使用的概念,与元类无关。 【参考方案1】:

你已经用 type = type('type',(),) 遮蔽了类型

请注意,分号在 Python 中是多余的。

所以你正在创建一个不能做任何事情的类型。

这就是后来的type 中断的原因。

【讨论】:

是的..我同意..我明白这就是正在发生的事情。但我的问题是为什么 python 甚至允许它和类型被隐藏,类 myclass(object) 是如何成功的?它不应该尝试使用我创建的类型类并因此失败吗? @Karthick 因为它有“同意成年人”的理念——你被允许覆盖任何内置...我可以写一个模块说 str = int, hex = lambda L: return 'FF' - 等等... Python 是一种灵活的语言,如果您明确希望这样做,它允许控制 - 这几乎总是不是必需的,但如果你发现需要使用它,黑魔法就在那里 我可以同意这个哲学,但我还是不明白 type('myclass', (), ) 失败但 Class myclass(Object) : pass 成功的原因 因为这是定义和构造的区别 好吧,如果我掩盖了它,我应该能够代替默认类型的仪式来做到这一点,这不是掩盖的目的吗?例如,当您在 C++ 中重载运算符 '+' 时,您只会看到重载的 '+' 而不是默认值。您可以使用函数显式调用它,也可以直接说 + 。两者都会调用我的函数而不是默认函数。【参考方案2】:

定义

>>> shadow = type("type",(),)
>>> shadow
<class '__main__.type'>
>>> isinstance(shadow,type)
True
>>> issubclass(shadow,type)
False
>>> shadow(int)

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    shadow(int)
TypeError: object.__new__() takes no parameters

建筑

>>> class shadow(type):
    pass

>>> shadow
<class '__main__.shadow'>
>>> isinstance(shadow,type)
True
>>> issubclass(shadow,type)
True
>>> shadow(int)
<type 'type'>
>>> shadow(type)
<type 'type'>
>>> shadow(1)
<type 'int'>

Python (and Python C API): __new__ versus __init__

【讨论】:

以上是关于在 python 中使用类型类创建类型类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中腌制一个动态创建的嵌套类?

类型化的python:在类定义中使用类自己的类型[重复]

Python:术语“类”VS“类型”

如何根据枚举类型重载python类方法

我可以在Python中使用类方法来获取此类的类型的参数吗?

Python进阶开发之元类编程