[python] Перекрестные ссылки в классах.
От: neFormal Россия  
Дата: 06.04.09 22:19
Оценка:
Как правильно сделать следующую вещь, чтобы python не ругался на "NameError: name 'Bar' is not defined"?.
class Foo:
    m = Bar()

class Bar:
    m = Foo()


есть какая нибудь конструкция, как в плюсах, чтобы объявить наличие класса до его определения?.
...coding for chaos...
Re: [python] Перекрестные ссылки в классах.
От: Константин Б. Россия  
Дата: 07.04.09 01:59
Оценка:
Здравствуйте, neFormal, Вы писали:

F>Как правильно сделать следующую вещь, чтобы python не ругался на "NameError: name 'Bar' is not defined"?.

F>
F>class Foo:
F>    m = Bar()

F>class Bar:
F>    m = Foo()
F>


F>есть какая нибудь конструкция, как в плюсах, чтобы объявить наличие класса до его определения?.


Можно сначала объявить класс, а потом присвоить ему все его члены.

class Foo:
  pass

class Bar:
  pass

Foo.m = Bar()
Bar.m = Foo()
Re[2]: [python] Перекрестные ссылки в классах.
От: neFormal Россия  
Дата: 07.04.09 07:39
Оценка:
Здравствуйте, Константин Б., Вы писали:

F>>есть какая нибудь конструкция, как в плюсах, чтобы объявить наличие класса до его определения?.

КБ>Можно сначала объявить класс, а потом присвоить ему все его члены.

да.. а можно всё передать в __init__()
но интересует именно вышеуказанный вариант
...coding for chaos...
Re: [python] Перекрестные ссылки в классах.
От: yumi  
Дата: 07.04.09 08:16
Оценка: 12 (1)
Здравствуйте, neFormal, Вы писали:

F>Как правильно сделать следующую вещь, чтобы python не ругался на "NameError: name 'Bar' is not defined"?.

F>
F>class Foo:
F>    m = Bar()

F>class Bar:
F>    m = Foo()
F>


Может как-то так?
class foo:
    def __init__ (self):
        self.name = "hello from foo!"
    
    def showBar (self):
        barRef = bar()
        print barRef.name

class bar:
    def __init__ (self):
        self.name = "hello from bar!"

    def showFoo (self):
        fooRef = foo()
        print fooRef.name

f = foo()
f.showBar()


F>есть какая нибудь конструкция, как в плюсах, чтобы объявить наличие класса до его определения?.


Насколько я знаю, в Питоне нет вообще declarations, только выполнимые конструкции, соответственно и нет forward declarations.
Lisp is not dead. It’s just the URL that has changed:
http://clojure.org
Re[2]: [python] Перекрестные ссылки в классах.
От: neFormal Россия  
Дата: 07.04.09 08:52
Оценка:
Здравствуйте, yumi, Вы писали:

F>>Как правильно сделать следующую вещь, чтобы python не ругался на "NameError: name 'Bar' is not defined"?.

Y>Насколько я знаю, в Питоне нет вообще declarations, только выполнимые конструкции, соответственно и нет forward declarations.

да, наверное, это так и есть.. надо почитать документацию..
спасибо..
...coding for chaos...
Re[3]: [python] Перекрестные ссылки в классах.
От: Константин Б. Россия  
Дата: 07.04.09 14:31
Оценка:
Здравствуйте, neFormal, Вы писали:

F>Здравствуйте, Константин Б., Вы писали:


F>>>есть какая нибудь конструкция, как в плюсах, чтобы объявить наличие класса до его определения?.

КБ>>Можно сначала объявить класс, а потом присвоить ему все его члены.

F>да.. а можно всё передать в __init__()

F>но интересует именно вышеуказанный вариант

В смысле? Ваш и мой вариант — идентичны.

Или вы имели ввиду что-то вроде
class Foo:
  def __init__(self):
    self.m = Bar()

class Bar:
  def __init__(self):
    self.m = Foo()


?

Тогда это заменяем на:

class Foo:
  pass

class Bar:
  pass

def init_foo(self):
  self.m = Bar();

def init_bar(self):
  self.m = Foo();

Foo.__init__ = init_foo;
Bar.__init__ = init_bar;
Re[4]: [python] Перекрестные ссылки в классах.
От: Константин Б. Россия  
Дата: 07.04.09 14:54
Оценка:
Здравствуйте, Константин Б., Вы писали:

КБ>
КБ>class Foo:
КБ>  def __init__(self):
КБ>    self.m = Bar()

КБ>class Bar:
КБ>  def __init__(self):
КБ>    self.m = Foo()
КБ>


КБ>?


КБ>Тогда это заменяем на:


Хотя нафиг не нужны такие извраты. Первый вариант и так работает )
Re[4]: [python] Перекрестные ссылки в классах.
От: neFormal Россия  
Дата: 07.04.09 15:35
Оценка:
Здравствуйте, Константин Б., Вы писали:

F>>да.. а можно всё передать в __init__()

КБ>В смысле? Ваш и мой вариант — идентичны.

я имел ввиду передачу параметров конструктору..

разницы нет, но просто не хочется, чтоб какие то атрибуты класса добавлялись во время работы..
...coding for chaos...
Re[2]: [python] Перекрестные ссылки в классах.
От: novitk США  
Дата: 13.04.09 19:34
Оценка:
Здравствуйте, yumi, Вы писали:

Y>Насколько я знаю, в Питоне нет вообще declarations, только выполнимые конструкции, соответственно и нет forward declarations.


Есть одно исключение и костыль — global
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.