LINUX.ORG.RU

Методы __init__ и __new__ у метакласса

 metaclass,


0

1

Вопрос знатокам Python. Поясните за методы __init__ и __new__ метакласса. Читал Лутца, но разницу так и не понял. Допустим, есть метакласс, который собирает список аттрибутов из своих классов по определенному критерию. Что-то по типу определения моделей в Django. Какой из этих методов правильнее будет переопределить?

sudo cast baverman tailgunner
sudo cast --group python

Спасибо.


sudo cast --group python

To use the`--group' option, you need to install a newer version of LOR :)

Xenesz ★★★★
()

__new__ управляет созданием, __init__ - инициализацией. Первый выполняется раньше второго.

В переводе - __new__ надо использовать, только если надо оверрайдить какой-нибудь класс (например, свой str сделать). Так что тут правильнее будет использовать __init__, IMO.

pztrn ★★★★
()
Ответ на: комментарий от tailgunner

Спасибо, почитаю. Тем не менее:

Какой из этих методов правильнее будет переопределить?

power
() автор топика
Ответ на: комментарий от power

метакласс, который собирает список аттрибутов из своих классов

Я не очень понимаю, что значит «собирать список атрибутов из $X», но начни с __init__:

$ cat m.py
class Bar(type):
        def __init__(cls, name, bases, dict):
                print cls, name, bases, dict

class Foo(object):
        __metaclass__ = Bar
        bletch = "bletch!"

Foo()
$ python m.py 
<class '__main__.Foo'> Foo (<type 'object'>,) {'__module__': '__main__', '__metaclass__': <class '__main__.Bar'>, 'bletch': 'bletch!'}

И почитай документ по моей ссылке _прежде_ чем задавать вопросы.

tailgunner ★★★★★
()

Всем спасибо.

power
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.