【发布时间】:2014-02-25 07:50:27
【问题描述】:
给定一个元类,或更简单的type(),最后一个参数代表类字典,它负责类变量。我想知道,有没有办法从元类中设置 instance 变量?
我使用元类的原因是我需要收集一些在创建类时定义的变量并处理它们。但是,此处理的结果需要附加到类的每个实例,而不是类本身,因为结果将是一个列表,该列表会因类的一个实例与另一个实例不同。
我将提供一个示例,以便更容易关注我。
我有一个Model 类,定义如下:
class Model(object):
__metaclass__ = ModelType
has_many = None
def __init__(self, **kwargs):
self._fields = kwargs
has_many class 变量将在类定义中由某人认为需要的任何模型填充。在__init__() 中,我只是将模型实例化时提供的关键字分配给instance 变量_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 由 both 用于实例化模型的 keyword 参数和 restricted fields 组成,如在元类中处理。如果 _fields 是 Model 类中的 class 变量,这将非常容易,但由于它是 instance 变量,我不知道我该怎么做还将限制字段添加到其中。
说了这么多,有什么方法可以实现吗?或者有没有更好的方法来处理这个? (我想过只使用一个元类并在模型上设置一个_restricted_fields类变量,然后在类__init__()中使用这个变量将受限字段添加到普通字段中,但是很快模型类就会变得杂乱无章在我看来,代码应该放在代码的另一部分)。
【问题讨论】:
-
你要找的是这种情况吗:当你创建一个类的新实例时,与现有实例相关的一些变量会发生变化?
-
其实这是我要防止的。这就是为什么我正在寻找一种在类创建时定义的机制,它将为实例化类时创建的变量分配默认值。
标签: python class oop instance metaclass