2011-08-21 6 views
0

現在、私はircbotを書き込もうとしており、問題を抱えています。ご覧のとおり、ソケットオブジェクトを作成するircBotクラスconnectのメソッドを定義します。私はsendCmdメソッドでこのオブジェクトを使用したいと思いますが、これは可能ですか?クラスとそのメソッドに関する質問

私はgoogleとstackoverflowを見てきましたが、解決策を見つけ出すことができませんでした(おそらく私はPythonを初めて使ったからです)。どんなヒントもありがとう!

import socket 
import sys 
import os 

class ircBot: 

    def sendCmd(self, cmd): 
     SEND_TEXT_ON_OPEN_SOCKET 

    def connect(self, server, port): 

     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     c = s.connect_ex((server, port)) 

     if c == 111: 
      print("Error: " + os.strerror(c)) 
      sys.exit(1) 

      print("Making connection to " + server + "\n") 

よろしく、

デビッド

答えて

3

は、トリックは、通常はPythonでselfという名前の、メソッドの最初のパラメータです。メソッドを呼び出すと、このパラメータは自動的に渡されます。

それは、クラスのインスタンスです - ので、あなたがircbot.sendCmd(cmd)をすれば、sendCmdselfとしてircbotを取得し、あなたが望むならばそれはself.sendCmdとしての地位を使用することができます。

selfに属性を追加してインスタンスに追加することができます。つまり、connectselfsendCmdになります。

import socket 
import sys 
import os 

class IrcBot: # You should consider doing 'class IrcBot(object):' 
       # if you're on Python 2, so it's a new-style class 
    def sendCmd(self, cmd): 
     # use self.s here 
     SEND_TEXT_ON_OPEN_SOCKET 

    def connect(self, server, port): 

     self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     c = self.s.connect_ex((server, port)) 

     if c == 111: # is this the only return code that matters? 
        # I don't know, you might want to check for others 
      print("Error: " + os.strerror(c)) 
      sys.exit(1) 

      print("Making connection to " + server + "\n") 

ircbot = IrcBot() 
ircbot.connect('localhost', 6667) 
ircbot.sendCmd('yourcmd') 
+2

1:通常、これは、メンバーレベルの変数と呼ばれるものを作成することによって行われます'Class.function(classInstance、argument)'。 –

+0

Python/OOPを学ぶだけで直接クラスのメソッドを呼び出すことができますが、クラスとそのインスタンスの最初の違いの感覚を得ることができます。 – agf

+0

私はそれを考えなかった。いい視点ね! –

0

connectの外部からアクセスできる変数に割り当てる必要があります。 `classInstance.function(引数が)`と同等です:私は `self`のより良い説明はこれであることが判明

class ircBot: 

    def sendCmd(self, cmd): 
     # SEND_TEXT_ON_OPEN_SOCKET 
     s.doSomething() 

    def connect(self, server, port): 

     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     c = s.connect_ex((server, port)) 

     if c == 111: 
      print("Error: " + os.strerror(c)) 
      # this should probably simply throw an exception. No need to take teh 
      # whole system down on socket connection failure. 
      sys.exit(1) 
     self.s = s 
     # I moved this up a level because you could never get to it in the 
     # if statement -- sys.exit leaves the application! 
     print("Making connection to " + server + "\n") 
+1

メンバーレベルの変数?インスタンス変数、インスタンス属性ではありませんか?私はこれがネット用語だと思うが、実際にはPythonで使われていると聞いたことがない? – agf

0
import socket 
import sys 
import os 

class ircBot: 

    def sendCmd(self, cmd): 
     if self.s is None: 
      raise "Not connected to a server" 
     self.s.send(cmd) 

    def connect(self, server, port): 

     self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     c = self.s.connect_ex((server, port)) 

     if c == 111: 
      print("Error: " + os.strerror(c)) 
      sys.exit(1) 

      print("Making connection to " + server + "\n") 
関連する問題