0

У меня есть следующий класс с внутренним классом и классом переменным:как просматривать переменный класс из внутреннего класса в Python

class MyForm(forms.ModelForm): 

    type_constant = 'type' 

    class Meta: 

     model = Customer 
     fields = ('type') 

Я хотел бы заменить «тип» в полях переменных с типом константы в суперкласс. Как использовать значение type_constant в значении переменной поля?

+0

Вы хотите написать '' fields = MyForm.type_constant', но без прямого обращения к MyForm? – hivert

ответ

0

Один из способов - передать внешний элемент класса в качестве параметра. Насколько я знаю, я не вижу лучшего способа. Интер-класс не имеет информации о том, какой класс включает его. И python не предлагает никаких конкретных ключевых слов или методов для доступа к внешнему классу. Так что лучше сделать это с передачей параметра.

__init__(self, other=None) 

in inter класс.

+0

@hivert Спасибо за указание. Здесь я имею в виду внешний класс. Я отредактировал свой ответ. – lulyon

+0

@hivert Я не вижу здесь оригинального комментария. Я неправильно работал? – lulyon

+1

Я удалил его после того, как вы исправили свой комментарий – hivert

0

Вы можете решить эту проблему с помощью проверки кадров:

import inspect 

def get_enclosing(name): 
    # get the frame where the enclosing class in construction is evaluated 
    outerframe = inspect.getouterframes(inspect.currentframe())[2][0] 
    return outerframe.f_locals[name] 

class Customer(object): 
    pass 
class MyForm(object): 

    type_constant = 'type' 

    class Meta: 

     model = Customer 
     fields = get_enclosing('type_constant') 

Тогда:

>>> MyForm.Meta.fields 
'type' 

Примечание 1: Я использую функцию задокументированных в inspect модуле (см http://docs.python.org/2/library/inspect.html). Скорее всего, это будет работать только в CPython.

Примечание 2:, если вам действительно не нужна какая-либо магия, передача параметров - это, вероятно, правильный способ сделать это. Я опубликовал свой ответ, чтобы показать, что это возможно, но я не буду считать его хорошим кодом, если у вас нет причины , чтобы избежать передачи информации из внешнего класса.