-3

在此示例中,我可以在x不触摸任何实例的情况下查找 的键C吗?

class C:
    def __init__(self):
        self.x = dict(one=1, two=2)

我的目的:

我有一个ElementClassManagerClassElementClass包含一个用 dict 实现的结构。并且ManagerClass方法必须通过将输入字典的键与原型字典键的键进行比较来验证输入。

如何在不模糊的情况下实现这一点?

UPD: 人们说如果我x用声明self,这意味着我已经接触过实例。实际上并不总是:

class C:
    x = dict(one=1, two=2)

    def m(self):
        print(id(self.x)

x = C()

在这个例子中,我没有x用声明self,但我可以用self.

4

2 回答 2

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()
于 2012-12-25T21:34:50.977 回答
1

没有实例作为属性的实例属性不存在。您可以从该类的实例访问类属性,但在这种情况下,该属性属于类本身,而不是实例。您可以查看一个简单的装饰器或描述符协议来创建一个结构,该结构x通过中央接口对每个实例的所有值进行编目,并允许类以不同于实例的方式访问数据......

于 2012-12-25T21:47:55.480 回答