Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在类常量中调用classmethod_Python_Python 3.x - Fatal编程技术网

Python 在类常量中调用classmethod

Python 在类常量中调用classmethod,python,python-3.x,Python,Python 3.x,我通过套接字发送一个对象,希望知道对象的大小(字节)。我编写了一个方法,以字节形式返回对象。在接收方,a必须知道对象的大小,因此我导入类并希望使用常量。为了定义常量,我编写了一个classmethod,它返回字节长度,但我不能在类中调用classfunction。在开发项目时,对象的大小可能会发生变化,这就是为什么我要动态计算对象的大小 类democlass: 字节大小=democlass.get\u字节大小 定义初始自我,t:int: self.data=t def as_bytesself-

我通过套接字发送一个对象,希望知道对象的大小(字节)。我编写了一个方法,以字节形式返回对象。在接收方,a必须知道对象的大小,因此我导入类并希望使用常量。为了定义常量,我编写了一个classmethod,它返回字节长度,但我不能在类中调用classfunction。在开发项目时,对象的大小可能会发生变化,这就是为什么我要动态计算对象的大小

类democlass: 字节大小=democlass.get\u字节大小 定义初始自我,t:int: self.data=t def as_bytesself->bytes: 一些struct.pack的东西。 返回objectasbytes @类方法 def获取字节大小->整数: 返回lendemoclass5.as_字节 导入演示类 类serverthreading.Thread: 定义初始自我,t:int: 线程.Thread.\uu初始化\uu self self.\uu sock=socket.socketsocket.AF\u INET,socket.sock\DGRAM 地址= '0.0.0.0', 自动端口 self.\uu sock.bindaddr def runself->字节: 尽管如此: msg=sock.recvdemoclass.BYTE\u大小 用数据做点什么 错误消息:

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

在完全定义类之前,不能构造类的实例。将常量的定义移到类定义的后面,并显式地将其附加到类,这将起作用,同时仍保持相同的行为:

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当您首先调用get_byte_size时,它还不存在。执行是自上而下的,所以还没有定义


2即使你移动了它,这个类也不会存在。它是类的一个方法,因此需要在类方法存在之前完成类的创建。

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

这是我们要发送的类:

我们将在这里使用json进行反序列化, 但是你想用什么就用什么 导入json 包含字符串和整数的示例类 类别MyClass: def u u init _; self,msg,编号: self.msg=msg self.number=number @静力学方法 def反序列化数据: json_str=data.decode'utf-8' data=json.loadsjson\u str 返回MyClassdata[0],数据[1] 自我定义: 数据=[self.msg,self.number] json_str=json.dumpsdata 返回json_str.encode'utf-8' 定义报告自我: 返回'MyClass'+self.msg+','+strself.number+ 下面是发送包的客户端:

导入套接字 sock=socket.socketsocket.AF_INET,socket.sock_DGRAM 服务器地址='localhost',12345 obj=MyClassHello world!,42 sock.sendtoobj.serialize,服务器地址 下面是接收对象的服务器:

导入套接字 sock=socket.socketsocket.AF_INET,socket.sock_DGRAM 服务器地址='localhost',12345 sock.bindserver\u地址 数据=sock.recv4096 obj=MyClass.deserializedata 短袜 打印数据 printobj 服务器的输出:

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

我希望这是有帮助的:

请修正缩进,你也不能做BYTE\u SIZE=democlass。在类democlass中获取BYTE\u SIZE,你想在这里实现什么?同样,通常我很擅长猜测人们想要写什么,但在这种情况下,我完全不知道。你在考虑@property decorator吗?好的。谢谢你的回复。我试图解释:我有一个对象,我想通过套接字发送。我仍然在使用这个对象,所以我不知道每次测试代码时的大小。因此,我尝试通过创建一个虚拟对象来动态获取大小,将其转换为字节,并返回字节的长度。我想知道socket.recv的大小,所以我只接收到与neeaah一样多的字节,现在它更有意义了。如何序列化该对象?我将编写一个序列化函数和一个构造函数,从序列化的字节字符串中重新创建该对象,然后您可以将字节字符串作为数据包发送。感谢您的努力,但我有一个自己实现序列化的原因。我为vehicle2infrastructure服务实现了一个原型协议。这是设计为每秒钟1000万次。因此,我在这个UDP消息中保存的每一点都可以节省网络容量和资源。我只需要发送一些我真正需要的信息。如果有必要,我真的不想和你争论,但我必须回答:序列化不是重点。您可以根据需要进行序列化。我想说的是,你不需要知道你的结构的大小,计算它是没有意义的。在发送方,您只需接收整个消息。在接收方,您不需要考虑消息的大小,只需要指定一个足够大的缓冲区。速度wi
另外,如果你想要这样的吞吐量,python是错误的语言。C、C++或锈蚀是合适的选择。是的,你是正确的,我不需要知道接收到的数据的大小,但是为什么我需要更多的数据呢?我将把这个值四舍五入到二的下一次幂。是的,Python对于这个项目来说是错误的语言,但是规定了。你没有收到比需要更多的数据。您收到的正是这些数据,在“recv”中指定一个更大的数字实际上并不会使您收到更多的数据。无论您指定的是接收的确切数字还是一个巨大的数字,传输的数据都将完全相同。