python如何使用__new __()函数的参数列表中的属性创建类?

时间:2016-02-11 10:36:12

标签: python metaclass

我想知道类型的__new__函数如何工作,如何使用attr参数创建一个类。

例如:

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', '')

然后,您可以像这样使用User类:     u =用户(id = 10190,name ='Michael',email ='orm @ db.org')     打印类型(u.id)     

那么,__new__函数如何将StringField转换为str?

1 个答案:

答案 0 :(得分:0)

  

__new__函数如何将StringField转换为str

简短回答:它没有 - 至少不在您发布的代码段中。此外,StringField class 属性,而非实例属性,因此self.id不一定是User.id

现在您没有发布所有相关代码(我们需要至少查看完整的ModelMetaclassModel类和Field类代码),也不提及任何提及这段代码来自哪里,所以很难确切地说出这里发生了什么。我假设这里发布的内容比你在这里发布的要多得多,而FWIW Field可能是一个描述符,或者整个事情可以像Django的ModelModelField那样工作(ModelField用于ORM部分,但匹配的Model实例属性只是普通的实例属性。)