См. обновление ниже
Я даже не знаю, как сделать короткое название для моей проблемы.
В классе у меня есть некоторые атрибуты класса StringField
класса:
class Authors(Table):
# id field is already present
first_name = StringField(maxLength=100)
last_name = StringField(maxLength=100)
StringField
может получить аргумент с именем name
. Если он не указан, я хочу, чтобы он был равен имени атрибута класса (first_name
, last_name
в приведенном выше примере).
Можно ли извлечь имя переменной, которой будет назначен созданный экземпляр? Думаю, мне нужно использовать модуль inspect
?
Я вижу, что Джанго делает это:
Каждый тип поля, кроме ForeignKey, ManyToManyField и OneToOneField, принимает необязательный первый позиционный аргумент — подробное имя. Если подробное имя не указано, Django автоматически создаст его, используя имя атрибута поля, преобразуя символы подчеркивания в пробелы.
В этом примере подробное имя — «имя человека»:
first_name = models.CharField("person's first name", max_length=30)
В этом примере подробное имя — «имя»:
first_name = models.CharField(max_length=30)
Но я не нахожу в исходном коде Django 1.3.1 часть, которая делает то, что мне нужно.
ОБНОВЛЕНИЕ:
Для упрощения:
class Field():
def __init__(self, field_name=None):
if not field_name:
field_name = ??? # some magic here to determine the name
print(field_name)
class Table():
first_name = Field()
last_name = Field()
Запуск этого должен напечатать first_name
и last_name
РЕШЕНИЕ:
class Field():
def __init__(self, name=None):
self._name = name
class Table():
first_name = Field()
last_name = Field()
for attrName, attr in Table.__dict__.items():
if isinstance(attr, Field):
if attr._name is None:
attr._name = attrName
print(Table.first_name._name)
print(Table.last_name._name)
Field()
без аргументов, создавая экземпляр классаField
. Затем он привяжет полученный аргумент к имениfirst_name
. До того, как произойдет это связывание,Field.__init__()
не может знать имя, с которым оно будет связано в будущем, так что предложенная вами магия действительно является магией. - person steveha   schedule 21.09.2011