寻址使用'self'声明的变量而不访问该类的任何实例

时间:2012-12-25 21:31:22

标签: python oop self

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

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

我的目的:

我有ElementClassManagerClassElementClass包含一个用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向其发送。

2 个答案:

答案 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值,并允许类以不同于实例的方式访问数据...