Попробуйте
def make_class(a):
class A(object): pass
A.a=a
return A
Ошибка, которую вы получаете (NameError: name 'a' is not defined
), заключается в том, что имя a
в классе скрывает параметр a
функции; следовательно, a
не определено, когда вы пытаетесь "a = a" в вашем коде. Другими словами, правая сторона a
является , а не a
от def
; вместо этого Python ищет его в классе A
, поскольку a
уже упоминалось в левой части задания.
Это становится более понятным с функциями:
x = 1
def a(x):
print 'a:',x
x = 3
def b():
print 'b:',x
b()
a(2)
def c():
x = x
Очевидно, что первый отпечаток должен печатать 2, а не 1, поэтому параметр x
из a
должен затенять глобальную переменную x
. b
определяется в области, где x
известен как параметр a
, поэтому печать работает.
Однако, если вы попытаетесь вызвать c
, вы получите UnboundLocalError: local variable 'x' referenced before assignment
, поскольку Python не связывает глобальные переменные автоматически. Чтобы это исправить, вы должны добавить global x
перед назначением.
Ваш случай выглядит примерно так:
x = 1
def a(x):
print 'a:',x
x = 3
def b():
x = x
print 'b:',x
b()
a(2)
Хотя печать x
работала в приведенном выше примере, назначение не работает. Это мера безопасности, чтобы убедиться, что переменные не просочились. Решение заключается в использовании параметра по умолчанию для «копирования» переменной в область действия b
:
x = 1
def a(x):
print 'a:',x
x = 3
def b(x=x):
x = x
print 'b:',x
b()
a(2)
Чтобы решить вашу проблему, вам нужно сказать Python «сделать параметр a
из make_class
видимым в A
», и вам нужно сделать это, прежде чем пытаться присвоить поле a
поля учебный класс. Это невозможно в Python. Если бы вы могли сделать a
видимым, присваивание изменило бы параметр, а не поле, так как Python не может их различить.
Так как вы не можете сделать его видимым, нет необходимости читать a
, следовательно, NameError
.
См. здесь для объяснения объема имени в Python.