56

別のモジュールにあるクラスがありますが、変更することはできません。

from module import MyClass

class ReplaceClass(object)
  ...

MyClass = ReplaceClass

これは、このファイル以外の場所ではMyClassを変更しません。ただし、このようなメソッドを追加すると

def bar():
   print 123

MyClass.foo = bar

これは機能し、fooメソッドは他のどこでも利用できるようになります。

クラスを完全に置き換えるにはどうすればよいですか?

4

4 に答える 4

72
import module
class ReplaceClass(object):
    ....
module.MyClass = ReplaceClass
于 2010-09-21T23:30:30.273 に答える
33

最も頻繁に必要なものが修飾from ... import名である場合、裸の名前を取得する (恐ろしい;-) 方法は避けてください。正しいPythonicの方法で物事を行うと:

import module

class ReplaceClass(object): ...

module.MyClass = ReplaceClass

このようにして、モジュールオブジェクトにモンキーパッチを適用します。これは必要なものであり、そのモジュールが他の人に使用されたときに機能します。from ...フォームを使用すると、モジュール オブジェクト (ほとんどの人が を使用する際の明らかな欠陥を確認する方法の 1 つ)を持っfrom ...ていないため、明らかに状態が悪化します;-);

このステートメントを使用することをお勧めする 1 つの方法はfrom、パッケージ内からモジュールをインポートすることです。

from some.package.here import amodule

そのため、引き続きモジュール オブジェクトを取得し、そのモジュール内のすべての名前に修飾名を使用します。

于 2010-09-21T23:33:25.247 に答える
17

私はただの卵です。. . . 初心者には明らかかもしれませんが、私にはfrom some.package.module import moduleイディオムが必要でした。

GeneralHelpfulClass の 1 つのメソッドを変更する必要がありました。これは失敗しました:

import some.package.module

class SpeciallyHelpfulClass(some.package.module.GenerallyHelpfulClass): 
    def general_method(self):...

some.package.module.GenerallyHelpfulClass = SpeciallyHelpfulClass

コードは実行されましたが、SpeciallyHelpfulClass にオーバーロードされた動作は使用されませんでした。

これはうまくいきました:

from some.package import module

class SpeciallyHelpfulClass(module.GenerallyHelpfulClass): 
    def general_method(self):...

module.GenerallyHelpfulClass = SpeciallyHelpfulClass

アレックスが書いたように、イディオムは「モジュールを取得する」と推測しfrom ... importます。これは、パッケージ内の他のモジュールによって取得されるためです。さらに推測すると、長いドット参照はモジュールを長いドット参照によるインポートで名前空間に持ち込むように見えますが、他の名前空間で使用されるモジュールは変更しません。したがって、インポート モジュールへの変更は、それらが行われた名前空間にのみ表示されます。同じモジュールの 2 つのコピーがあり、それぞれがわずかに異なる参照の下で利用可能であるかのようです。

于 2011-10-20T01:38:56.213 に答える
2
import some_module_name

class MyClass(object): 
     ... #copy/paste source class and update/add your logic

some_module_name.MyClass = MyClass

何らかの形で誰かが getattr を使用してそれらを参照した可能性があるため、置換中にクラスの名前を変更しないことをお勧めします - 以下のように失敗します

getattr(some_module_name, 'MyClass')--> MyClass を ReplaceClass で置き換えた場合、これは失敗します。

于 2010-09-22T05:38:44.027 に答える