在类常量中调用classmethod

时间:2019-06-13 10:11:18

标签: python python-3.x

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

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

3 个答案:

答案 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)

我希望这会有所帮助:)