仅在嵌套类之间共享对象

时间:2014-05-14 20:20:23

标签: python class

首先,我知道下面的代码是荒谬的,可以是一个简单的循环,但我想了解是否/如何在嵌套类中做一些事情:

class OuterClass(object):
    counter = 0  # Class variable

    def __init__(self, v):
        super(OuterClass, self).__init__()
        self.values = v # Instance variable
        self.run()

    def run(self):
        for v in values:
            self.NestedClass(v)  # can I bound a nested class to the outer?
        print self.NestedClass.size


    class NestedClass(object):
        size = 0     # Nested Class variable

        def __init__(self, value):
            super(NestedClass, self).__init__()  # NameError: global name 'NestedClass' is not defined
            NestedClass.size += 1     # Nested Instance variable

我的目的是为每个OuterClass实例创建一个NestedClass类。 所以我希望每个OuterClass实例的size都不同。

如何修复最后两行:

super(NestedClass, self).__init__()
NestedClass.size += 1
  • 如果我写self.NestedClass.size,它会尝试在自己内部找到一个NestedClass并抛出错误。
  • 如果我写OuterClass.NestedClass.size它将绑定到外部类,并且大小将是OuterClass实例中的相同对象(我不想这样)。
  • 我还尝试使用OuterClass.self.NestedClass.size
  • AttributeError: type object 'OuterClass' has no attribute 'self'

2 个答案:

答案 0 :(得分:0)

  

... OuterClass实例中的大小将是同一个对象(我不想这样)。

只要sizeNestedClass的类成员,它只存在一次。这是因为只有一个类NestedClass,而size是该类的成员。

如果您希望每个实例都有一个size成员,那么,那个实例成员是...

答案 1 :(得分:0)

如果您执行以下操作:

>>> class Outter:
...   class Inner:
...     nb = 0
...     def __init__(self):
...       Outter.Inner.nb += 1
...   def test(self):
...     t = self.Inner()
...     print(t.nb)
... 
>>> o = Outter()
>>> o.test()
1
>>> o.test()
2
>>> o.test()
3

您正在创建一个类变量,该变量将绑定到类Outter.Inner和 每次修改它时,它都会更改该类的所有实例。

  

我的目的是为每个OuterClass实例创建一个NestedClass类。所以我希望每个OuterClass实例的大小都不同。

如果您希望该变量依赖于每个Outter实例,则需要 在Outter上创建对Inner的反思:

>>> class Outter:
...   def __init__(self):
...     self.nb = 0
...   class Inner:
...     def __init__(self, o):
...       o.nb += 1
...   def test(self):
...     t = self.Inner(self)
...     print(self.nb)
... 
>>> o = Outter()
>>> o.test()
1
>>> o.test()
2
>>> o.test()
3
>>> o2 = Outter()
>>> o2.test()
1
>>> o2.test()
2
>>> o2.test()
3
>>> 

这种方式变量是每个Outter实例的实例成员,并进行了修改 每个Inner个实例。