Python:如何定义对象/变量(例如复杂的“ 1j”)?

时间:2018-08-30 18:18:46

标签: python class object generalization

又如何定义自己的变量/对象类型,使其与python中提供的操作兼容?

是否可以不必将自己的对象类和运算符创建为单独实体来执行此操作?我不介意必须创建自己的对象类(即给定的对象),但是我希望它可以与现有结构完美地集成在一起。因此,请强调我希望避免“分离和分离”。

我正在尝试创建四元数对象类。我想定义一个不同于1j的1i和1k。

是的,一个软件包可能已经存在;这纯粹是学术性的,对于我自己的编程实践和理解。我试图扩展已经存在的内容,而不是构建与众不同的东西。

我已经做过类对象,但是不幸的是,它们需要重新定义基本操作才能使用它们,即使那样,我也必须在使用它们之前“声明”这些对象,这与“ 1j”完全不同。 / p>

我希望我的意图是明确的。四元数的最终结果不是我的意图。这是方法,对象和一般化的类型,我试图弄清楚该怎么做,扩展和利用python已经内置的内容。

在我看来,构建numpy和cmath的人已经能够实现这一目标。


感谢下面的评论。我现在有了词汇来更好地表达自己的意图。

我正在尝试向Pythons SYNTAX添加新功能。

如果任何人都可以提供有关执行此操作的资源,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

我在这里为您提供了两种选择:

  1. 更改Python语法(fork CPython),有关如何执行此操作的文章很多。
  2. 构建某种Mypy之类的预处理器。

无论哪种方式,仅仅拥有一个新的文字值似乎都太麻烦了。

答案 1 :(得分:0)

Python不支持自定义运算符或自定义文字。

支持自定义文字的语言是C ++(我相信自C ++ 11起),但是它不支持自定义运算符。

Haskell是支持自定义运算符的语言。

如果要将此功能添加到Python,则必须使用Python源代码,修改其语法,修改lexer / parser,更重要的是编译器。

但是,此时您仅创建一种新语言,这意味着您破坏了与python的兼容性。

最简单的解决方案就是编写一个简单的预处理程序,用一个扩展的等效语句替换一些简单的语法。例如:

sed -i 's/(\d)+\+(\d+)i/MyComplex(\1, \2)/g' my_file.py

然后,您可以在库/应用程序的构建步骤中执行预处理器。

这具有让您编写所需代码的优点,但是在您发货/使用它时,它会翻译成普通的python,与现有安装保持100%的兼容性。

我相信使用import hooks可以避免必须交付库的预处理版本……基本上,预处理器可以包含在导入步骤中,并且可以即时完成。这样可以避免处理临时的预处理文件。

唯一的要求是需要使用您的库的人必须以某种方式安装导入挂钩。