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

时间:2019-02-02 18:49:43

标签: python

我使用python,我想创建一个有很多变数,其中一些将是正常的变量和其他人将需要更新到服务器的类。我有一个遍历所有对象变量的循环,但是我不知道如何识别需要更新的变量。 我能有这些对象作为一类具有一个变量,但我不会喜欢。有没有办法做到这一点?

一种可接受的方式

我希望在其C#库中拥有Unity之类的东西,您可以在其中定义诸如public int health = 100;之类的常规int,但也可以将其定义为[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)

1 个答案:

答案 0 :(得分:1)

无法像C#中那样向属性添加注释。 (较新版本的python do 支持type annotations,但是它们是用于 type 注释的。我建议不要出于其他目的滥用它们。)< / p>

标记一堆属性的最简单方法是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)