Доступ к дочернему классу из другого дочернего класса внутри родительского класса - PullRequest
1 голос
/ 13 ноября 2010

Я действительно не знал, какое название мне выбрать.В любом случае, у меня есть такой код (это fixtures ):

from fixture import DataSet

class CategoryData(DataSet):
    class cat1:
        name = 'Category 1'
    class cat2:
        name = 'Category 2'
        parent = cat1

Проблема в том, что я не могу ссылаться на cat1 в cat2 так:

File "/home/julas/cgp/cgp/datasets/__init__.py", line 11, in cat2
    parent = cat1
NameError: name 'cat1' is not defined

Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 13 ноября 2010

Здесь есть две проблемы.

Во-первых, Python не делает для вас вложенную область видимости. Чтобы получить доступ к CategoryData.cat1, вам нужно прописать его.

Во-вторых, более серьезная проблема заключается в том, что отсюда нет доступа к CategoryData: класс еще не определен, поскольку вы находитесь в процессе его определения. Если вы сделаете это:

class Object(object):
    a = 1
    b = Object.a

произойдет сбой, потому что значение Object не присваивается до конца определения класса. Вы можете думать о том, что это происходит так:

class _unnamed_class(object):
    a = 1
    b = Object.a
Object = _unnamed_class

Нет способа сослаться на a от того, где назначен b, потому что содержащему классу еще не присвоено его имя.

Чтобы назначить parent как свойство класса, вам нужно назначить его после того, как содержащийся класс реально существует:

class CategoryData(DataSet):
    class cat1:
        name = 'Category 1'
    class cat2:
        name = 'Category 2'
CategoryData.cat2.parent = CategoryData.cat1
1 голос
/ 13 ноября 2010

Вы либо: Уберите это из определения:

CategoryData.cat2.parent=CategoryData.cat1

Или, если это атрибут объекта (а не атрибут класса):

class cat2:
    name = 'Category 2'
    def __init__(self):
        self.parent = cat1
...