Python захватить класс в определении класса - PullRequest
2 голосов
/ 02 мая 2010

Я даже не знаю, как это объяснить, поэтому вот код, который я пытаюсь.

from couchdb.schema import Document, TextField

class Base(Document):
    type = TextField(default=self.__name__) 
    #self doesn't work, how do I get a reference to Base?

class User(Base):
    pass

#User.type be defined as TextField(default="Test2")

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

Ответы [ 2 ]

3 голосов
/ 02 мая 2010

Объект класса (пока) не существует, пока выполняется тело класса, поэтому у кода в теле класса нет способа получить ссылку на него (так как, вообще говоря, нет никакого способа для любого кодачтобы получить ссылку на любой объект, который не существует).Test2.__name__, однако, уже делает то, что вы конкретно ищете, поэтому я не думаю, что вам нужен какой-либо обходной путь (например, метаклассы или декораторы классов) для вашего конкретного варианта использования.

Редактировать: для отредактированного вопроса, где вам не нужно просто указывать имя в виде строки, декоратор класса - это самый простой способ обойти проблему (в Python 2.6 или более поздней версии):

def maketype(cls):
    cls.type = TextField(default=cls.__name__)
    return cls 

и поставьте @maketype перед каждым классом, который вы хотите украсить таким образом.В Python 2.5 или более ранних версиях вам вместо этого нужно сказать maketype(Base) после каждого соответствующего оператора class.

Если вы хотите, чтобы эта функция была унаследована, вам нужно определить пользовательскийметакласс, который выполняет те же функции в своих __init__ или __new__ методах.Лично я бы рекомендовал не определять пользовательские метаклассы, если они не являются действительно необходимыми - вместо этого я бы придерживался более простого подхода декоратора.

0 голосов
/ 02 мая 2010

Вы можете проверить другой вопрос Выбор суперкласса Python

В вашем случае Test2 .__ base__ вернет базовый класс Test. Если это не работает, вы можете использовать новый стиль: класс Test (object)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...