59

Python には C# のような拡張メソッドがありますか? 次のようなメソッドを呼び出すことは可能ですか:

MyRandomMethod()

のような既存のタイプではint

myInt.MyRandomMethod()
4

6 に答える 6

68

Python コードで定義されたクラス オブジェクトに好きなメソッドを追加できます (別名モンキー パッチ):

>>> class A(object):
>>>     pass


>>> def stuff(self):
>>>     print self

>>> A.test = stuff
>>> A().test()

これは組み込み型では機能しません。それら__dict__は書き込み可能ではないためです (それは ですdictproxy)。

いいえ、Python には「実際の」拡張メソッド メカニズムはありません。

于 2009-02-05T00:59:31.207 に答える
9

それがあなたが求めているものかどうかはわかりませんが、既存の型を拡張してから、新しいもので好きなものを呼び出すことができます:

class  int(int):
     def random_method(self):
           return 4                     # guaranteed to be random
v = int(5)                              # you'll have to instantiate all you variables like this
v.random_method()

class int(int):
    def xkcd(self):
        import antigravity
        print(42)

>>>v.xkcd()
Traceback (most recent call last):
  File "<pyshell#81>", line 1, in <module>
    v.xkcd()
AttributeError: 'int' object has no attribute 'xkcd'
c = int(1)
>>> c.random_method()
4
>>> c.xkcd()
42

あなたの質問を明確にすることを願っています

于 2009-02-05T00:53:57.117 に答える
2

私はここで説明されている方法で幸運に恵まれました:

http://mail.python.org/pipermail/python-dev/2008-January/076194.html

ビルトインで動作するかどうかはわかりませんが。

于 2009-02-05T17:59:17.217 に答える
-1

もう 1 つのオプションは、メタクラスをオーバーライドすることです。これにより、とりわけ、すべてのクラスに存在する必要がある関数を指定できます。

この記事はそれについて議論し始めます:

http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html

于 2009-02-05T01:14:45.763 に答える