2016-02-11 4 views
-1

Я хочу знать, как работает функция типа __new__, как он может создать класс с использованием параметров attr.Как python создает класс с использованием атрибутов в списке параметров функции __new __()?

для примера:

class ModelMetaclass(type): 
    def __new__(cls, name, bases, attrs): 
     return type.__new__(cls, name, bases, attrs) 

class User(Model): 
    __metaclass__ = ModelMetaclass 
    id = StringField(primary_key=True, ddl='varchar(50)') 
    email = StringField(ddl='varchar(50)') 
    password = StringField(ddl='varchar(50)') 

class StringField(Field): 
    def __init__(self, **kw): 
     self.name = kw.get('name', None) 
     self.primary_key = kw.get('primary_key', False) 
     self.ddl= kw.get('ddl', '') 

Затем вы можете использовать пользовательский класс как это: и = Пользователь (ID = 10190, имя = 'Michael', email='[email protected] ') тип печати (u.id)

Итак, как функция __new__ переводит StringField на str?

ответ

0

, как работает функция __new__ перевести StringField в str?

Короткий ответ: его нет - по крайней мере, в фрагменте кода, который вы опубликовали. Кроме того, StringField s - это класс атрибуты, а не атрибуты экземпляра, поэтому self.id необязательно User.id.

Теперь вы не отправлял все соответствующего кода (мы должны были бы увидеть хотя бы полный ModelMetaclass, в Model класс и класс код Field), ни какого-либо упоминания о том, где этот код приходит, так что трудно точно расскажите, что здесь происходит. Я предполагаю, что есть много чего, кроме того, что вы разместили здесь, и FWIW Field может быть дескриптором, или все это может работать как Django's Model и ModelField (где ModelField используется для части ORM, но соответствующие атрибуты экземпляра Model являются просто экземпляром экземпляра атрибуты).