我使用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)
答案 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)