0

これはおそらく基本的な質問ですが、プログラミングは初めてです。私はサードパーティの Python コードを使用しており、イベントとイベント デリゲートを含むクラスを提供しています。イベントとイベント デリゲートの構文は次のとおりです。

    public Delegate Sub RequestEventDelegate (request As MDNPRequest, _
      response as MDNPResponseParser)

    public Event RequestEvent As MDNPRequest.RequestEventDelegate 

イベントにサブスクライブするために次のコードを書きましたが、機能しません。何が間違っているのかわかりません。

    Mreq = MDNPRequest()
    Mreq.RequestEvent += Mreq.RequestEventDelegate(handleResponseEvent)

    def handleResponseEvent (request, response):
        print ' event fired'

通信チャネルを開く関数の最後に 2 行のコードを追加しています。また、通信チャネルでポーリングを送信する関数に 2 行のコードを追加してテストしました。2 番目のシナリオでは、イベントが発生し、ポーリング関数を実行するたびに発生します。これはイベント サブスクリプションの目的に反しますか?


私の問題は、おそらく同じクラスのインスタンスを作成するさまざまな機能が原因だと思います。以下に示すアウトラインを使用して、一部の関数をクラスに統合したいと考えています。Method1 は、myClass の他のメソッドで使用したい class1 のインスタンス 'a' を作成します。class1 インスタンスに設定したクラス変数を使用しようとしましたが、これは機能しません。class1 の myClass.variable.somemethod などのクラス名を使用してクラス変数を参照しますが、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生します。myClass のすべてのメソッドが a にアクセスできるようにする最善の方法は何ですか? 最終的に、別のモジュールから myClass を呼び出したいと思います。

    from file1 import *

    myClass:

       class_variable = class1() # class1 from file1

       def __init__(self)
       ...

       def Method1(self, argument list):
         # this method instantiates a  
          ...
          a = class1() 

       def Method2 (self):
          ...
          a.class1method1
          ...

       def Method3 (self):
          ...
          a.class1method2
          ...
4

2 に答える 2

2

これが実際にあなたのコードである場合:

Mreq.RequestEvent += Mreq.RequestEventDelegate(handleResponseEvent)

def handleRequestEvent (request, response):
    print ' event fired'

handleResponseEventと同じではありませんhandleRequestEvent


ちなみに、明示的なデリゲートを作成する必要はほとんどありません。これは便利な最適化である場合もありますが、間違いを犯す可能性のあるもう 1 つの問題であり、そうすると有用なデバッグ情報を偽装する可能性のあるもう 1 つの問題であるため、通常は最初にコードを記述せずにコードを記述し、デリゲートとしてラップするだけで追加する方が簡単です。それが機能した後、それらを大量に作成していて、メモリを節約したい場合。

于 2013-09-20T02:01:47.453 に答える
0

その後の編集から、Python でクラスがどのように機能するかの基本が欠けていると思われます。チュートリアルの章を読むか、より使いやすい/より詳細なチュートリアルを検索することをお勧めします。

特に:

以下に示すアウトラインを使用して、一部の関数をクラスに統合したいと考えています。Method1 は、myClass の他のメソッドで使用したい class1 のインスタンス 'a' を作成します。class1 インスタンスに設定したクラス変数を使用しようとしましたが、これは機能しません。

それはそれを行う方法ではありません。のようなクラス属性は、インスタンスの作成時ではなくclass_variable、クラスの作成時 (つまり、通常、importモジュールまたはスクリプトの実行直後) に作成されます。クラスのインスタンスが作成されたときに何かを作成したい場合は、クラス属性ではなくインスタンス属性を使用し、それらを__init__メソッドで設定します。あなたの場合、インスタンスMethod1で呼び出されるまでインスタンスを作成したくありません。これもまた、インスタンス属性を使用することを意味します。Method1ではなく、内部で行うだけです__init__

また、クラス属性はクラスのすべてのインスタンスで共有されます。インスタンス属性、各インスタンスには独自の属性があります。犬について: 各犬には独自の尻尾があります。すべての犬が共有する尻尾は 1 つではなくtail、インスタンス属性です。多くの場合、単純なスクリプトでは、クラスのインスタンスを 1 つしか作成しないため、違いに気付かないことがあります。しかし、実際に違いを理解できない場合は、(例のように) 概念的に考えてDogください。それでも理解できない場合は、ほとんどの場合、インスタンス属性が必要です。

class1 の myClass.variable.somemethod などのクラス名を使用してクラス変数を参照しますが、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生します。

ほとんどの場合、これはclass1COM/interop または .NET クラスであり、関連するセットアップを行う前にそれを作成して使用しようとしていることが原因ですimport。モジュール/スクリプトを実行します。もしそうなら、意図したときに作成すれば問題ありません。

myClass のすべてのメソッドが a にアクセスできるようにする最善の方法は何ですか?

Method1次のように、 でインスタンス アトリビュートを作成します。

def Method1(self, argument list):
    # this method instantiates a  
     ...
    self.a = class1() 

そして、同じように使用します:

def Method2 (self):
     ...
    self.a.class1method1()
     ...

実行するa = whateverだけで、メソッドの最後で消えるローカル変数が作成されます。クラス属性、インスタンス属性、またはグローバルと同じ名前を持っている場合でも、変更したいものを変更するのではなく、新しいローカル変数を作成しています。他のいくつかの言語とは異なり、Python では、何を上書きしようとしているのか (インスタンス属性の <code>self.a myClass.a、クラス属性の場合など) を明示する必要があるため、誤って上書きすることはありません。

また、最後の式の最後の括弧にも注意してください。関数またはメソッドを呼び出す場合は、括弧が必要です。それ以外の場合は、メソッド自体を値として参照しているだけです。


最終的に、別のモジュールから myClass を呼び出したいと思います。

「class myClass」の意味がわかりません。クラスを呼び出すと、クラスの新しいインスタンスが構築されます。その後、他のオブジェクトと同じ方法でそのインスタンスのメソッドを呼び出すことができます。それがどのモジュールで定義されたかは問題ではありません (明らかに と書く必要があることを除いてmy_instance = mymodule.MyClass())。

標準ライブラリの使用方法を見てください。それはまったく同じです。たとえば、 の場合、 と書くimport csvことで a を構築できます。そして、次のように記述してそのメソッドを呼び出します。構築したら、それがどのモジュールから来たかは問題ではありません。DictWritermy_writer = csv.DictWriter(my_file)my_writer.writerow(my_row)


もう一つ:

次のようなクラスを定義しようとしました:

myClass:

明らかにそれはできません。classキーワードが必要です。しかしまた、Python 2.x では、object他に何も必要ない場合に使用して、常に基本クラスを提供したいと考えています。そうしないと、古いスタイルのクラスになり、学習したくない、デバッグする必要のない、あらゆる種類の奇妙な癖や制限が発生します。そう:

class myClass(object):
于 2013-09-23T18:32:17.870 に答える