4

一部の組み込みのPythonタイプをカスタムタイプに置き換えることは可能ですか?

次のようなものを作成したい:

class MyInt(object):
   ...
__builtin__.int = MyInt
x = 5
4

3 に答える 3

4

リテラルを入力したときに作成される型をオーバーライドできるかどうかを尋ねているようです。答えはいいえだ。x = 5ビルトインタイプ以外のタイプを使用するようにすることはできませんint

You can override __builtin__.int, but that will only affect explicit use of the name int, e.g., when you do int("5"). There's little point to doing this; it's better to just use your regular class and do MyInt("5").

More importantly, you can provide operator overloading on your classes so that, for instance, MyInt(5) + 5 works and returns another MyInt. You'd do this by writing an __add__ method for your MyInt class (along with __sub__ for subtraction, etc.).

于 2012-08-03T01:50:54.603 に答える
2

ビルトインを置き換えることについてはわかりませんが、ビルトインを継承したり、ビルトインのように動作したりするオブジェクトを作成することはできます。次のようなものを検索すると、inherit from immutableのオーバーライドを示す回答が見つかるはずです__new__。後者のオプションについては、「数値タイプのエミュレート」を参照してください。

于 2012-08-03T01:22:51.547 に答える
2

Pythonesque DSLを作成するため、次の2つのオプションがあります。

  1. コードをASTにコンパイルし、必要に応じてノードを置き換えるASTをウォークします。
  2. 手作業で独自のASTを作成します。

ASTを入手したら、先に進んで直接実行できます。いずれの場合も、ASTの生成と操作についてはPythonの言語サービスを参照してください。

于 2012-08-03T19:03:30.657 に答える