>

소켓을 통해 객체를 보내고 객체의 크기를 바이트로 알고 싶습니다. 객체를 바이트로 반환하는 메서드를 작성합니다. 수신자 측에서 객체의 크기를 알아야하므로 클래스를 가져오고 상수를 사용하고 싶습니다. 상수를 정의하기 위해 바이트 단위의 길이를 반환하는 클래스 메서드를 작성했지만 클래스 자체에서 클래스 함수를 호출 할 수 없습니다. 프로젝트를 개발하는 동안 객체의 크기를 변경할 수 있으므로 용도 크기를 동적으로 계산하는 이유는 무엇입니까?

class democlass():
    BYTE_SIZE = democlass.get_byte_size()
    def __init__(self, t: int):
        self.data = t
    def as_bytes(self) -> bytes:
        """
        Some struct.pack() stuff.
        """
        return objectasbytes
    @classmethod
    def get_byte_size(cls) -> int:
        return len(democlass(5).as_bytes())

import democlass

class server(threading.Thread):
    def __init__(self, t: int):
        threading.Thread.__init__(self)
        self.__sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        addr = (
            '0.0.0.0',
            self.port
        )
        self.__sock.bind(addr)
    def run(self) -> bytes:
        while True:
            msg = sock.recv(democlass.BYTE_SIZE)
            do_something_withdata()

오류 메시지 :

BYTE_SIZE = democlass.get_byte_size()
NameError: name 'democlass' is not defined


  • 답변 # 1

    클래스의 인스턴스가 완전히 정의 될 때까지 인스턴스를 생성 할 수 없습니다. "constant"의 정의를 클래스 정의 바로 다음으로 옮기고 명시 적으로 클래스에 첨부하면 여전히 동일하게 작동하면서 작동합니다.

    class democlass():
        def __init__(self, t: int):
            self.data = t
        def as_bytes(self) -> bytes:
            """
            Some struct.pack() stuff.
            """
            return objectasbytes
        @classmethod
        def get_byte_size(cls) -> int:
            return len(democlass(5).as_bytes())
    democlass.BYTE_SIZE = democlass.get_byte_size()
    
    

  • 답변 # 2

    여기에 두 가지 문제가 있습니다

    1) get_byte_size ()를 먼저 호출 할 때는 아직 존재하지 않습니다. 실행은 위에서 아래로 정의되지 않았습니다.

    2) 옮기더라도 수업이 존재하지 않습니다. 클래스의 메소드이므로 클래스 메소드가 존재하기 전에 클래스 작성을 완료해야합니다.

  • 답변 # 3

    코드를 수정하는 대신 필요 이상으로 복잡한 작업을하고 있다고 생각합니다. 간단한 서버-클라이언트 객체 직렬화 예제를 제공하고 싶습니다.

    이것은 우리가 보내려는 수업입니다 :

    # We will use json for (de-)serialization here,
    # but you can use whatever you want
    import json
    # An example class that holds a string and an integer
    class MyClass:
        def __init__(self, msg, number):
            self.msg = msg
            self.number = number
        @staticmethod
        def deserialize(data):
            json_str = data.decode('utf-8')
            data = json.loads(json_str)
            return MyClass(data[0], data[1])
        def serialize(self):
            data = [self.msg, self.number]
            json_str = json.dumps(data)
            return json_str.encode('utf-8')
        def __repr__(self):
            return 'MyClass("' + self.msg + '", ' + str(self.number) + ')'
    
    

    이제 패키지를 보내는 클라이언트가 있습니다 :

    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server_address = ('localhost', 12345)
    obj = MyClass("Hello world!", 42)
    sock.sendto(obj.serialize(), server_address)
    
    

    여기에 객체를받는 서버가 있습니다 :

    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server_address = ('localhost', 12345)
    sock.bind(server_address)
    data = sock.recv(4096)
    obj = MyClass.deserialize(data)
    sock.close()
    print(data)
    print(obj)
    
    

    서버 출력 :

    b'["Hello world!", 42]'
    MyClass("Hello world!", 42)
    
    

    이것이 도움이되기를 바랍니다. :)

  • 이전 html - Bootstrap-Vue 카드 구성 요소 이미지가 렌더링되지 않습니다
  • 다음 폴리머 3 앱의 섀도우 돔 사용법 (youtubecom 예)