2015-05-21 1 views
3

Мне удалось определить класс A, используйте список экземпляров другого класса B как переменную экземпляра класса A. класс B имеет функцию для изменения переменной экземпляра класса A a1. Класс A также имеет функцию изменения переменной экземпляра класса 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) 

Что я хочу знать, так это, если такой тип вложенного класса уменьшит эффективность python? Любое лучшее решение?

+0

Возможно, вы захотите прочитать [zen] (https://www.python.org/dev/peps/pep-0020/). –

+0

Вложенные классы Python не похожи на Java, где вложенный класс, где внутренний класс может ссылаться на экземпляры внешнего класса. Они фактически являются двумя отдельными классами. 'A.a1 = pyfunc1()' назначит поле 'a1' на _class_. –

ответ

4

Вложение класса не снижает и не повышает эффективность выполнения. Это может изменить эффективность обслуживания и понимания.

Вложенный класс, потому что только другой атрибут на родительский класс. Вам нужно будет ссылаться на него как A.B, а не B. Вот и все, вы отложили поиск к другому пространству имен. Другими словами, ваш метод __init__ потерпит неудачу, поскольку глобального имени B не существует, существуют только A.B и self.B (оба ссылаются на один и тот же объект класса).

Взаимоотношения между вложенным классом и его родителем, как и в Java, нет.

Большинство разработчиков Python не вставляют классы, поэтому, когда вы это делаете, вы нарушаете соглашение и увеличиваете стоимость обслуживания.

+0

Спасибо. Я изменил свой сценарий в соответствии с вашим предложением. И я откажусь от такого стиля. – xibinke

Смежные вопросы