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 中没有。此外,StringField
s 是 class 属性,而不是实例属性,因此 self.id
不一定是 User.id
。
现在您没有发布所有相关代码(我们至少需要查看完整的 ModelMetaclass
、Model
类和 Field
类代码),也没有提及此代码的来源,所以很难准确地说出这里发生了什么。我认为比您在此处发布的内容要多得多,FWIW Field
可能是一个描述符,或者整个事情可以像 Django 的 Model
和 ModelField
一样工作(其中 ModelField
用于 ORM 部分,但匹配的Model
实例属性只是普通的实例属性)。
【讨论】:
以上是关于python如何使用__new__()函数的参数列表中的属性创建类?的主要内容,如果未能解决你的问题,请参考以下文章