在此示例中,我是否可以在不触及任何x
实例的情况下查找C
的键?
class C:
def __init__(self):
self.x = dict(one=1, two=2)
我的目的:
我有ElementClass
和ManagerClass
。 ElementClass
包含一个用dict补充的结构。并且ManagerClass
方法必须通过比较输入dict的键和原型字典键的键来验证输入。
如何在没有默默无闻的情况下实施?
UPD:
人们说如果我用x
声明self
,就意味着,我已经触及了实例。
实际上并非总是如此:
class C:
x = dict(one=1, two=2)
def m(self):
print(id(self.x)
x = C()
在此示例中,我未使用x
声明self
,但我可以使用self
向其发送。
答案 0 :(得分:3)
不适合您当前的设置。但是,您可以将x
设为类变量:
class C(object):
x = dict(one=1, two=2)
您可以使用类变量并保留一个类范围的实例列表:
class C(object):
instances = []
def __init__(self):
self.x = dict(one=1, two=2)
self.instances.append(self)
现在,您可以通过访问类变量来迭代C
的所有实例:
for instance in C.instances:
print instance.x
使用类变量不是一个好主意。只需在经理类中添加一个列表:
class Manager(object):
def __init__(self):
self.elements = []
def is_valid(self, element):
return 42 not in element.x
def validate(self):
for element in self.elements:
if not self.is_valid(element):
return False
return True
class Element(object):
def __init__(self, manager):
manager.elements.append(self)
self.x = {'one': 1, 'two': 2}
if __name__ == '__main__':
manager = Manager()
element1 = Element(manager)
element2 = Element(manager)
element3 = Element(manager)
print manager.validate()
答案 1 :(得分:1)
如果没有实例属性,则实例属性不存在。您可以从该类的实例访问类属性,但在这种情况下,该属性属于类本身,而不是实例。您可以查看一个简单的装饰器或描述符协议来创建一个结构,通过中央接口为每个实例编目所有x
值,并允许类以不同于实例的方式访问数据...