Python : 클래스 외부에서 메서드를 호출하는 방법은 무엇입니까?

너는

정말 짧고 쉬운 질문이 있습니다.

다른 파이썬 파일 / 클래스 에서 send () 메서드를 호출하는 방법은 무엇입니까? 다른 구성 요소에서 클라이언트로 메시지를 보내고 싶습니다 (연결이 설정 됨).

싱글 톤 인스턴스의 참조를 가져 와서 다음과 같이 "보내야"한다고 생각했습니다.

server = Server(ip,port)
server.send("hello")

그렇게하면 오류가 발생합니다.

NoneType' object has no attribute 'send'

어쩌면 "자기"가 여기에 문제가있을 수도 있습니다 ...

다음은 서버 클래스입니다.

class Server(threading.Thread):

    ##############################################################################
    # Server: Singleton Instance
    ##############################################################################
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Server, cls).__new__(cls, *args, **kwargs)
        return cls._instance    

    ##############################################################################
    # Constructor of Server
    ##############################################################################
    def __init__(self, host, port):
        threading.Thread.__init__(self)
        print "[SERVER____] Creating Server Thread"
        self.host = host
        self.port = port
        self.__reset__()  

    ##############################################################################
    # Resetting local attributes
    ##############################################################################
    def __reset__(self):   
        print "[SERVER____] Reset"         
        self.serverSock = None
        self.clientSock = None
        self.clientAddr = None
        self.clientData = None
        self.isRunning = None
        self.isWaiting = None

    ###########################################################################                
    def send(self, message):
        print "[SERVER____] Sending Message", message
        self.clientSock.send(message)

    ##############################################################################
    # Stop the Server: Close the Socket and Reset
    ##############################################################################
    def stop(self):            
        # Close The Client Socket
        if(self.clientSock): 
            self.clientSock.close()
            print "[SERVER____] Aborting Client Socket"
        # Close The Server Socket    
        if(self.serverSock): 
            self.serverSock.close()
            print "[SERVER____] Aborting Server Socket"
        # Reset the Member Fields
        self.__reset__()
        print "[SERVER____] Aborting Server Thread"
        self._Thread__stop()

    ##############################################################################
    # Server.start()
    ##############################################################################
    def run(self):          
        try:
            # Create The Socket
            self.serverSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            print "[SERVER____] Creating Server Socket"
            # Set Socket Options
            #self.serverSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1);
            # Bind The New Socket
            self.serverSock.bind((self.host, self.port))
            print "[SERVER____] Binding Server Socket"
            print "[SERVER____] IP: ", self.host, " Port: ", self.port
            # Set The Awaiting Flag
            self.isWaiting = True;
            # Start The Server Loop
            while self.isWaiting:
                # Listen On New Socket
                self.serverSock.listen(1)
                print "[SERVER____] Listening Server Socket"
                # Accept New Connection            
                self.clientSock, self.clientAddr = self.serverSock.accept()     
                print "[SERVER____] Accepting New Connection: " , self.clientAddr
                # Set The Running Flag
                self.isRunning = True;     
                # Serve The Connection
                while self.isRunning:
                    print "[SERVER____] Want to recv message...."
                    try:
                        # Receive A New Data Block    
                        self.clientData = self.clientSock.recv(config.BUFFERSIZE)
                        # Process The New Data Block
                        if not self.clientData:                       
                            print "[SERVER____] Reset By Client Connection"
                            break
                        else:    
                            print "[SERVER____] Receiving Message: ", self.clientData
                            parser = MessageParser()
                            parser.parseSMMessage(self.clientData)                    
                    except socket.error:
                        print "[SERVER_ERR] Error at receiving data from client."                            
        except Exception as exc:
            print "[SERVER____] Server Thread Exception ", exc
인터 제이

싱글 톤 패턴의 구현이 잘못되어을 호출 self.clientSock하기 None전에 로 설정됩니다 self.clientSock.send. __init__싱글 톤 인스턴스를 가져올 때마다 호출되므로 구현이 잘못되었습니다 . 기본적으로 발생하는 일은 다음과 같습니다.

  1. Server(...)인스턴스를 가져 오기 위해 호출 합니다.
  2. run해당 인스턴스에서 호출됩니다. 이것은 self.clientSock.
  3. Server(...)인스턴스를 다시 가져 오기 위해 호출 합니다. 이 구현으로 인해 동일한 인스턴스가 반환 __new__되지만 __init__인스턴스 에서 다시 호출되어 self.clientSock로 재설정됩니다 None.
  4. 이제에 대한 호출로 self.clientSock.send인해 예외 발생합니다.

__new__싱글 톤이 필요한 경우 사용하지 않는 것이 좋습니다 (단일 톤을 전혀 사용하지 않는 것이 가장 좋습니다). 다른 방법은 여기 에 나열되어 있습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Python : 클래스 외부에서 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

외부 클래스에서 내부 클래스의 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

두 부모 클래스에서 "overriden"메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

Kotlin의 내부 클래스에서 조각 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

같은 클래스에서 인터페이스 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

Python : 가져온 모듈에서 클래스 메서드를 호출하는 방법은 무엇입니까? "자기"논쟁 문제

분류에서Dev

다른 화면 클래스에서 Python으로 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

클래스 throw 이벤트에서 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

클래스 메서드 내에서 PDO 변수를 호출하는 방법은 무엇입니까?

분류에서Dev

다른 클래스에서 get 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

구조체에서 정적 클래스 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 클래스의 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

클래스 메서드에서 addTarget : action : forControlEvents :를 호출하는 방법은 무엇입니까?

분류에서Dev

클래스에서 다른 함수 (메서드)를 호출하는 방법은 무엇입니까?

분류에서Dev

조각의 Java 클래스에서 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

다른 클래스에서 invalidate () 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

다른 클래스에서 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

CSS 클래스 외부에서 LESS Mixin을 호출하는 방법은 무엇입니까?

분류에서Dev

정적 클래스를 참조하여 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

PHP : 현재 클래스에서 사용되는 트레이 트 메서드에서 부모 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

각 클래스 메서드 호출 전후에 함수를 실행하는 방법은 무엇입니까?

분류에서Dev

Django / Python : 자식 클래스 내의 부모 클래스에서 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

익명의 내부 클래스 내부에서 메서드를 호출하는 것은 무엇입니까?

분류에서Dev

클래스를 알 때 메서드를 올바르게 호출하는 방법은 무엇입니까?

분류에서Dev

Python 클래스에 사용자 지정 메서드를 추가하는 방법은 무엇입니까?

분류에서Dev

Python의 모든 클래스 메서드에 전역 변수를 사용하는 방법은 무엇입니까?

분류에서Dev

Python 클래스의 메서드를 장식하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

파이썬에서 동적 클래스 생성 후 부모 클래스의 __init__ 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

다른 클래스에서 추상 내부 클래스 메서드를 호출하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    Python : 클래스 외부에서 메서드를 호출하는 방법은 무엇입니까?

  2. 2

    외부 클래스에서 내부 클래스의 함수를 호출하는 방법은 무엇입니까?

  3. 3

    두 부모 클래스에서 "overriden"메서드를 호출하는 방법은 무엇입니까?

  4. 4

    Kotlin의 내부 클래스에서 조각 메서드를 호출하는 방법은 무엇입니까?

  5. 5

    같은 클래스에서 인터페이스 메서드를 호출하는 방법은 무엇입니까?

  6. 6

    Python : 가져온 모듈에서 클래스 메서드를 호출하는 방법은 무엇입니까? "자기"논쟁 문제

  7. 7

    다른 화면 클래스에서 Python으로 함수를 호출하는 방법은 무엇입니까?

  8. 8

    클래스 throw 이벤트에서 메서드를 호출하는 방법은 무엇입니까?

  9. 9

    클래스 메서드 내에서 PDO 변수를 호출하는 방법은 무엇입니까?

  10. 10

    다른 클래스에서 get 메서드를 호출하는 방법은 무엇입니까?

  11. 11

    구조체에서 정적 클래스 메서드를 호출하는 방법은 무엇입니까?

  12. 12

    파이썬에서 클래스의 메서드를 호출하는 방법은 무엇입니까?

  13. 13

    클래스 메서드에서 addTarget : action : forControlEvents :를 호출하는 방법은 무엇입니까?

  14. 14

    클래스에서 다른 함수 (메서드)를 호출하는 방법은 무엇입니까?

  15. 15

    조각의 Java 클래스에서 메서드를 호출하는 방법은 무엇입니까?

  16. 16

    다른 클래스에서 invalidate () 메서드를 호출하는 방법은 무엇입니까?

  17. 17

    다른 클래스에서 메서드를 호출하는 방법은 무엇입니까?

  18. 18

    CSS 클래스 외부에서 LESS Mixin을 호출하는 방법은 무엇입니까?

  19. 19

    정적 클래스를 참조하여 메서드를 호출하는 방법은 무엇입니까?

  20. 20

    PHP : 현재 클래스에서 사용되는 트레이 트 메서드에서 부모 메서드를 호출하는 방법은 무엇입니까?

  21. 21

    각 클래스 메서드 호출 전후에 함수를 실행하는 방법은 무엇입니까?

  22. 22

    Django / Python : 자식 클래스 내의 부모 클래스에서 함수를 호출하는 방법은 무엇입니까?

  23. 23

    익명의 내부 클래스 내부에서 메서드를 호출하는 것은 무엇입니까?

  24. 24

    클래스를 알 때 메서드를 올바르게 호출하는 방법은 무엇입니까?

  25. 25

    Python 클래스에 사용자 지정 메서드를 추가하는 방법은 무엇입니까?

  26. 26

    Python의 모든 클래스 메서드에 전역 변수를 사용하는 방법은 무엇입니까?

  27. 27

    Python 클래스의 메서드를 장식하는 가장 좋은 방법은 무엇입니까?

  28. 28

    파이썬에서 동적 클래스 생성 후 부모 클래스의 __init__ 메서드를 호출하는 방법은 무엇입니까?

  29. 29

    다른 클래스에서 추상 내부 클래스 메서드를 호출하는 방법은 무엇입니까?

뜨겁다태그

보관