0

クラスはPythonのファーストクラスのオブジェクトであるため、関数に渡すことができます。たとえば、私が遭遇したコードは次のとおりです。

ChatRouter = sockjs.tornado.SockJSRouter(ChatConnection, '/chat')

ここChatConnectionで、は同じモジュールで定義されたクラスです。そのような実践の一般的なユーザーケースは何でしょうか?

さらに、上記のコード例では、変数「ChatRouter」が大文字になっているのはなぜですか?

4

2 に答える 2

1

そのコードについて他に何も知らなくても、私はこれを推測します:

わかりました、ソースを見ました。もっともらしいですが、線の下は正しくありません。基本的に、コードが行うことは、他のことを行うオブジェクトChatConnectionを作成するために使用されます。クラス名ではなく、ただの名前の悪い通常の変数です。SessionChatRouter


SockJSRouter別のクラス ( と呼びますconnection) と文字列をパラメーターとして受け取るクラスです。のインスタンスではなく、(おそらくサブクラス) を使用する特別なクラスの__new__インスタンスを作成するために使用します。それはクラス名になるので、大文字になっている理由を説明します。返されたクラスは、ネットワークなどを介した通信の処理を担当するなど、多くのことを一般化するために使用されます。したがって、異なる を使用することで、異なるプロトコルを処理できます。おそらくIRC上のいくつかのレイヤーです。SockJSRouterconnectionChatRouterconnectionconnectionconnectionChatConnection

したがって、基本的に、一般的なユースケース (そしておそらくここでの使用) は一般化であり、BactrianCase という名前の理由は、それがクラス (実行時に生成されるもの) であるためです。

于 2012-05-04T03:08:30.190 に答える
1

クラスを渡すことは、カスタマイズや柔軟なコードに役立つ場合があります。関数は、指定されたクラスの複数のオブジェクトを作成する必要がある場合があるため、クラスを渡すことは、これを実装する 1 つの方法です (別の方法は、何らかのファクトリ関数を渡すことです)。たとえば、あなたが与えた例ではSockJSRouter、接続クラスをに渡すことになりSession、それを使用して新しい接続オブジェクトを構築します。

に関してはChatRouter、これは単なる命名規則だと思います。Python プログラマーは PEP 8 に従うことをお勧めしますが、多くの人はそうしていますが、厳密には必須ではなく、一部のプロジェクトでは異なる命名規則が採用されています。

于 2012-05-04T03:03:06.203 に答える