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

Posted

技术标签:

【中文标题】python如何使用__new__()函数的参数列表中的属性创建类?【英文标题】:How does python create class using attributes in the parameter list of __new__() function? 【发布时间】:2016-05-22 02:04:45 【问题描述】:

我想知道 __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 = User(id=10190, name='Michael', email='orm@db.org') 打印类型(u.id)

那么,__new__ 函数是如何将 StringField 翻译成 str 的呢?

【问题讨论】:

【参考方案1】:

__new__ 函数如何将StringField 转换为str

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

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

【讨论】:

以上是关于python如何使用__new__()函数的参数列表中的属性创建类?的主要内容,如果未能解决你的问题,请参考以下文章

Python学习————魔法方法

Python基础 __init__与__new__区别

python面试题

Python中的魔法函数总结整理

Python面试进阶问题,__init__和__new__的区别是什么?

python override __new__无法向__init__发送参数