Python: Имена классов еще не определены - PullRequest
4 голосов
/ 10 января 2011

У меня есть «class1», который должен быть в состоянии создать объект другое имя класса. Имя класса передается в качестве аргумента под названием «друг». Я хочу, чтобы в качестве аргумента "друг" по умолчанию использовалось имя класса "class2".

Кроме того, мне нужно иметь такое же поведение для класса "class2". Таким образом, «class2» должен иметь «class1» в качестве аргумента-друга по умолчанию:

class class1():
 def __init__(self, friend = class2):
  self.friendInstance = friend()

class class2():
 def __init__(self, friend = class1):
  self.friendInstance = friend()

class1()
class2()

Теперь я получаю следующее сообщение об ошибке:

    def __init__(self, friend = class2):
NameError: name 'class2' is not defined

Конечно, я не могу определить class2 до class1, потому что это приведет к аналогичной ошибке: «class1» не определен. Вы знаете решение?

Большое спасибо за вашу помощь!

Henry

Ответы [ 2 ]

3 голосов
/ 10 января 2011

Вы можете выдвинуть его позже:

class class1(object):
    def __init__(self, friend=None):
        if friend is None:
            friend = class2
        self.friendInstance = friend()

Редактировать: На самом деле, не делайте этого.Он создаст экземпляр class2, который создаст экземпляр class1, который создаст экземпляр class2 и т. Д. Возможно, вы действительно хотите передать экземпляр вместо экземпляра класса, который будет создан:

class class1(object):
    def __init__(self, friend=None):
        if friend is None:
            self.friendInstance = class2(self)
        else:
            self.friendInstance = friend

и аналогично для class2.Это не так гибко, но довольно просто.Если вам действительно нужна гибкость, вы можете сделать что-то вроде этого:

class class1(object):
    def __init__(self, friend=None, friendClass=None):
        if friend is None:
            self.friendInstance = (class2 if friendClass is None else friendClass)(self)
        else:
            self.friendInstance = friend

class class2(object):
    def __init__(self, friend=None, friendClass=class1):
        if friend is None:
            self.friendInstance = friendClass(self)
        else:
            self.friendInstance = friend

Это можно упростить с помощью наследования или метаклассов, но вы, вероятно, получите идею.

1 голос
/ 10 января 2011

Даже если вы решите NameError, вы столкнетесь с другим, а именно с тем, что вы пытаетесь создать рекурсивную структуру данных.Каждый экземпляр class1 пытается создать экземпляр class2, который также пытается создать другой class1 экземпляр и т. Д.получить RuntimeError: maximum recursion depth exceeded).

Не зная немного больше о том, что вы на самом деле пытаетесь сделать, вот одно простое решение:

class class1(object):
    def __init__(self, friend=None):
        if friend is None:
            friend = class2(self) # create a class2 instance with myself as a friend
        self.friendInstance = friend

class class2(object):
    def __init__(self, friend=None):
        if friend is None:
            friend = class1(self) # create a class1 instance with myself as a friend
        self.friendInstance = friend

print class1()
# <__main__.class1 object at 0x00B42450>
print class2()
# <__main__.class2 object at 0x00B65530>
...