【问题标题】:Create a new type in python [closed]在python中创建一个新类型[关闭]
【发布时间】:2014-05-03 13:47:08
【问题描述】:

Python 3.x 中是否有创建新类型的方法?我只能找到在 C++ 中做到这一点的方法。 (我不是说顺便添加/编辑语法)

基本上我想要做的是创建一个词法分析器,我在其中扫描输入,python 已经可以做 int 和 string,但是如果我想要另一个数据类型,比如 name,我该如何分配它以便我可以做......

例子:

    # This can be done
    a = "string"
    type(a)
    > <class, 'str'>

    # How can I do this?
    b = myName
    type(myName)
    > <class, 'name'>

【问题讨论】:

  • class declaration。或者您的意思是,您希望能够使用文字值创建名称对象,就像整数使用数字、字符串使用引号、字典使用大括号和冒号一样?我不认为你可以修改语言的语法来添加新的东西。
  • 查看 PyParsing 库。它可能会帮助您进行词法分析和解析。
  • 请参阅eli.thegreenplace.net/2012/03/30/… 了解类型和类的区别。您可能希望使用类而不是实现新类型。
  • 如果你想创建一个没有任何关联方法或属性的唯一类型,你可以使用type()的3参数版本

标签: python python-3.x types


【解决方案1】:

简短的回答是,如果不编辑源代码(用 C 编写),就无法在 python 中创建新类型。

然而,在 python 中创建class 的答案可能是更简单的方法,因为编辑源代码可能会导致与包的兼容性问题(可能)。

【讨论】:

  • 这不是真的。您可以创建从类型继承的对象。这称为“元类”。
【解决方案2】:

你会想要这样的东西,class。在源代码中,您在 Python 中看到的所有对象类型都是 class 形式。

>>> class myName:
...     def __init__(self, name):
...         self.name = name
...     def __str__(self):
...         return self.name
...

>>> b = myName('John')
>>> type(b)
<class '__main__.myName'>
>>> print(b)
John

输出与您预期的略有不同的原因是因为class 的名称是myName,所以这就是type() 返回的内容。此外,我们在 class 名称之前获得了 __main__.,因为它是当前模块的本地名称。

【讨论】:

  • +1 这是显而易见且正确的答案。你可能会抱怨它在“语言的设计者想把这个东西称为'类型'”上失败了,但这更多的是问题而不是答案。
  • 这几乎是完美的!有没有办法让类型 myName 而不是 main.myname?还有一种方法可以将字符串转换为这种类型吗? EX) main.myName('Jack') 喜欢 int('4') 吗?
  • 不确定它何时是模块本地的,但执行 type(b).__name__ 将仅返回 'myName' 自己。您当然可以使用它进行类型转换,它的工作方式与内置函数相同。例如,example = 'bob'; a = myName(example) 就可以这样工作。
  • 谢谢!有没有办法让我在调用 print(b) 时得到 John 而不是 <__main__myname object at>... 很像 print('dsds') 和 print(5)
  • @user3324343 查看编辑,这正是 __str__ 特殊功能的用途。如果我对你有帮助please accept my answer.
【解决方案3】:

你可以看看元类:http://eli.thegreenplace.net/2011/08/14/python-metaclasses-by-example/

但是,你到底想达到什么目的?

【讨论】:

  • 元类对于这个任务来说开销太大
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2021-11-04
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
相关资源
最近更新 更多