2015-05-21 116 views
3

我设法定义一个类A,使用另一个类B的实例列表作为类A的实例变量。 B类具有更改A类另一个实例变量a1的功能。类A还具有改变类B的实例变量bb的功能。因此,A类可以访问B类,而B类可以访问A类。 这两个类是嵌套在一起的。我知道我们可以更容易地将B类的所有实例变量和函数更改为A类。但是在我的项目中,这种嵌套结构是真实的东西。在python中制作嵌套类是否是一个好习惯?

class A: 
    class B: 
     count = 0 
     def __init__(self,b1=None,b2=None): 
      self.b1 = b1 
      self.b2 = b2 
     def funcb(self,bb): 
      A.a1 = pyfunc1(bb) 
    def __init__(self,a1,a2): 
     self.a1 = a1 
     self.a2 = a2 
     self.listb = [A.B()] 
    def funca(self,aa): 
     A.B.count += 1 
     b = A.B(self.a1,self.a2) 
     listb.append(b) 
     listb[A.B.count].b1 = listb[A.B.count-1].b1.pyfunc2(aa) 
     listb[A.B.count].b2 = pyfunc3(aa,self.a2) 
     listb[A.B.count].funcb(self.a2) 

我想知道的是,如果这种类型的嵌套类的会降低效率蟒蛇?有更好的解决方案

+0

您可能想阅读[the zen](https://www.python.org/dev/peps/pep-0020/)。 –

+0

Python的嵌套类不像Java那里的嵌套类,内部类可以引用外部类的实例。他们实际上是两个不同的班级。 'A.a1 = pyfunc1()'将在_class_上分配'a1'字段。 –

回答

4

嵌套类不会降低也不会提高执行效率。它可能会改变维护和理解效率。

嵌套类,因为只是父类的另一个属性。您必须将其作为A.B而不是B来引用它。就是这样,你把查询推迟到一个不同的命名空间。换句话说,您的__init__方法将失败,因为没有全局名称B,只有A.Bself.B存在(都引用相同的类对象)。

嵌套类和它们的父类之间没有特别的关系,就像在Java中一样。

大多数Python开发人员不会嵌套类,所以当您这样做时,会打破惯例并增加维护成本。

+0

谢谢。我根据你的建议修改了我的脚本。因此我会放弃这种风格。 – xibinke

相关问题