我通过套接字发送了一个对象,想知道对象的大小(以字节为单位)。我写了一个方法以字节为单位返回对象。在接收方,必须知道对象的大小,因此我导入了类并希望使用常量。为了定义常量,我编写了一个类方法,该方法以字节为单位返回长度,但是我自己无法在类中调用类函数。在开发项目时可以更改对象的大小,这就是为什么我动态地计算使用大小的原因。
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
答案 0 :(得分: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()
答案 1 :(得分:1)
这里有两个问题
1)第一次调用get_byte_size()时,它尚不存在。执行是自上而下的,因此尚未定义。
2)即使您移动了它,该类也不存在。这是类的方法,因此需要在类方法存在之前完成类的创建。
答案 2 :(得分: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)
我希望这会有所帮助:)