2

我通过套接字发送一个对象,并想知道对象的大小(以字节为单位)。我写了一个方法将对象作为字节返回。在接收方,必须知道对象的大小,所以我导入类并想使用一个常量。为了定义常量,我编写了一个以字节为单位返回长度的类方法,但我不能自己调用​​类中的类函数。在开发项目时可以更改对象的大小,这就是为什么我动态地计算使用大小的原因。

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
4

3 回答 3

3

在完全定义之前,您不能构造一个类的实例。将“常量”的定义移动到类定义之后并将其显式附加到类,这将起作用,同时仍然具有相同的行为:

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()
于 2019-06-13T10:25:39.183 回答
1

这里有两个问题

1)当您首先调用 get_byte_size() 时,它还不存在。执行是从上到下的,所以没有定义。

2)即使你移动它,这个类也不存在。它是类的方法,所以类的创建需要在类方法存在之前完成。

于 2019-06-13T10:25:56.587 回答
0

我认为您所做的事情比必要的更复杂,而不是修复您的代码,我想为您提供一个简单的服务器-客户端对象序列化示例。

这是我们要发送的类:

# 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)

我希望这是有帮助的 :)

于 2019-06-13T11:06:37.793 回答