如何创建标记为某物的对象

2024-09-30 00:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python,我想创建一个包含许多变量的类,其中一些是普通变量,其他的需要更新到服务器。我有一个遍历对象所有变量的循环,但我不知道如何识别哪些变量需要更新。我可以将这些对象作为一个带有一个变量的类,但我不希望这样做。有没有一种可以接受的方法来实现这一点?你知道吗

我想要Unity的C#库中有这样的东西,你可以定义一个正则int,比如public int health = 100;,但是你也可以将它定义为[SyncVar] public int health =100;,然后你可以像平常一样使用这个变量,除非它有额外的数据。你知道吗

检查对象变量的循环如下所示:

def send_sync_vars(o):    
    for k, v in o.__dict__.iteritems():
        if isinstance(v, SyncVar):
            update_var(k ,v)

Tags: 数据对象方法服务器send定义defunity
1条回答
网友
1楼 · 发布于 2024-09-30 00:32:57

无法像在C#中那样向属性添加注释。(较新版本的pythondo支持type annotations,但是它们是用于类型注释的。我建议不要为了别的目的滥用它们。)

将一组属性标记为SyncVars最简单的方法可能是将它们的名称存储在类属性中:

class MyClass:
    SYNC_VARS = {'foo', 'bar'}

    def __init__(self, foo, bar, baz):
        self.foo = foo
        self.bar = bar
        self.baz = baz

def send_sync_vars(o):    
    for k, v in vars(o).items():
        if k in o.SYNC_VARS:
            update_var(k, v)

另一种可能是对整个过程进行过度设计,并将这些属性实现为descriptors

class SyncVar(property):
    def __init__(self, fget=None, fset=None, fdel=None, *args, **kwargs):
        if fget is None:
            fget = self.default_getter

        if fset is None:
            fset = self.default_setter

        if fdel is None:
            fdel = self.default_deleter

        super().__init__(fget, fset, fdel, *args, **kwargs)

    @staticmethod
    def default_getter(self):
        return self._value

    @staticmethod
    def default_setter(self, value):
        self._value = value

    @staticmethod
    def default_deleter(self):
        del self._value

class MyClass:
    foo = SyncVar()
    bar = SyncVar()

    def __init__(self, foo, bar, baz):
        self.foo = foo
        self.bar = bar
        self.baz = baz

def send_sync_vars(o):    
    for k, v in vars(type(o)).items():
        if isinstance(v, SyncVar):
            v = getattr(o, k)
            update_var(k, v)

相关问题 更多 >

    热门问题