type()
,最后一个参数是类字典,负责类变量。我想知道,有没有一种方法可以从元类中设置实例变量?我使用元类的原因是我需要收集在类创建时定义的一些变量并对它们进行处理。但是,这个处理的结果需要附加到类的每个实例上,而不是类本身,因为结果将是一个列表,它将因一个类实例而异。
我会提供一个示例,以便更容易理解我的意思。
我有一个名为
Model
的类,定义如下:class Model(object):
__metaclass__ = ModelType
has_many = None
def __init__(self, **kwargs):
self._fields = kwargs
has_many
类变量将在类定义时由任何需要的模型填充。在__init__()
中,我只是将提供的关键字分配给实例变量_fields
。
然后我有了ModelType
元类:
class ModelType(type):
def __new__(cls, name, bases, dct):
if 'has_many' in dct:
dct['_restricted_fields'].append([has-many-model-name])
我需要做的事情非常简单。我检查某人是否在自定义模型类上定义了
has_many
class变量,然后将该变量的内容添加到受限字段列表中。现在来到重要的部分。在实例化模型时,我需要
_fields
由实例化模型使用的关键字参数和元类中处理的受限字段组成。如果_fields
是Model
类中的类变量,那么这将非常容易,但是由于它是一个实例变量,我不知道如何将受限字段添加到其中。综上所述,有没有办法实现这一点?或者有更好的处理方式吗?(我考虑仅使用元类并在模型上设置
_restricted_fields
类变量,然后在类__init__()
中使用此变量将受限字段添加到普通字段中,但很快模型类将充斥着代码,我认为应该将其放在代码的另一部分)。