2013-07-16 3 views
0

Я пишу код и имел общий вопрос о питонеСфера классов внутри функций и классов внутри класса в Python

Если у меня есть что-то вроде этого:

class A(): 
     def __init__(self): 
      self.name 
      ... 
     def doSomething(self): 
      class B(): 
       def __init__(self): 
        self.name 
        ... 
      c = B() 
      c.whatever() 

Означает ли это, что класс B является приватным только для этой функции или может быть вызван из экземпляра класса A? На этой ноте, если бы я имел некоторый код, как это:

class A(): 
    class B(): 
     def __init__(self): 
      self.name 

    def __init__(self): 
     self.name 
     ... 
     def doSomething(self): 
     ...  

я могу назвать его, делая это d = A.B() правильно?

ответ

1

Дело в том, что оператор class просто создает переменную, значение которой является классом. То, как работает область видимости класса, одинакова, как область видимости переменной будет работать, если вы просто сделали обычное назначение переменной, например x = 2.

Любые переменные, создаваемые внутри функции, являются локальными для этой функции, если не указано иное. Поэтому использование оператора class внутри функции просто создает локальную переменную, значение которой является классом. Он не может быть доступен извне функции.

Другими словами, это:

def foo(): 
    class A(object): 
     pass 

не очень отличается от этого:

def foo(): 
    A = 2 

В обоих случаях вы создаете локальную переменную А внутри функции. В одном случае его значение представляет собой класс, а в другом его значение является целым числом, но в обоих случаях оно является локальной переменной и не существует вне функции.

В вашем втором примере класс создается внутри входящего класса. Переменные, созданные внутри пространства имен классов, являются атрибутами класса, поэтому да, вы можете получить к нему доступ, как вы описываете. (Почему вы хотите сделать это другой вопрос.) Другими словами, как описано выше, это:

class A(object): 
    class B(object): 
     pass 

не отличается от этого:

class A(object): 
    B = 2 

В обоих случаях вы создаете класс A, который имеет атрибут класса B.

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