2017-06-12 49 views
0

我想为我的graphene.ObjectType子类创建一个meta类。我的主要目标是从包含其名称的字符串列表中创建类的属性(即Graphene对象的字段)。在石墨烯中使用Metacles的错误

例如,​​

对于这份名单,我的课Attack必备的东西是这样的:

class Attack(graphene.ObjectType): 
    quantity = graphene.String() 
    position = graphene.String() 

我这样做的方法如下:

import graphene 
from graphene.types.objecttype import ObjectType, ObjectTypeMeta 

class mytype(ObjectTypeMeta): 
    def __new__(cls, clsname, base, clsdict): 
     print "Hello" 
     setattr(cls, 'quantity', graphene.String()) 
     return ObjectTypeMeta.__new__(cls, clsname, base, clsdict) 

class combined_meta(mytype, ObjectTypeMeta): 
    pass 

class Attack(graphene.ObjectType): 
    __metaclass__ = combined_meta 
    def __init__(self, dic): 
     self.quantity = "123" 
     print "Hello world" 
     print dic 

class Query(graphene.ObjectType): 
    attack = graphene.Field(Attack) 
    def resolve_attack(self, args, context, info): 
     return Attack(dict()) 

schema = graphene.Schema(query = Query) 

query = ''' 
{ 
    attack 
} 
''' 

result = schema.execute(query) 
print result.data 

我看到"Hello"有许多错误..

AssertionError: Attack fields must be a mapping (dict/OrderedDict) with field names as keys or a function which returns such a mapping. 

我做错什么了......?

回答

2

您正在用错误的方式创建__new__。元类“__new__”的第一个参数是元类本身,而不是您正在创建的类。正在创建的实际“cls”是type.__new__的返回 - 在这种情况下,由ObjectTypeMeta.__new__调用。 另一方面,你得到的第四个参数是类名字空间 - 它是注入你的新属性的正确位置。

所以,只是尝试这样的事:

import graphene 
from graphene.types.objecttype import ObjectType, ObjectTypeMeta 

class mytype(ObjectTypeMeta): 
    def __new__(metacls, clsname, base, clsdict): 
     print "Hello" 
     clsdict['quantity'] = graphene.String() 
     return ObjectTypeMeta.__new__(metacls, clsname, base, clsdict) 

... 
+0

谢谢!我也只在一小时前得出这个结论。 – return007