Python-\uuuu getattribute\uuuuu在循环中中断填充列表

Python-\uuuu getattribute\uuuuu在循环中中断填充列表,python,oop,flask,iteration,Python,Oop,Flask,Iteration,所以我想我误解了我的_ugetAttribute的实现。我创建了这个类: class Model: schema = [ 'foo', 'bar' ] values = {} def __init__(self, input_values=None): if input_values is not None: self

所以我想我误解了我的_ugetAttribute的实现。我创建了这个类:

    class Model:

        schema = [
            'foo',
            'bar'
        ]
        values = {}

        def __init__(self, input_values=None):
            if input_values is not None:
                self.validate_input(input_values)

        def __call__(self, *args, **kwargs):
            if args[0] is not None:
                self.validate_input(args[0])

        def __iter__(self):
            for key, value in self.values.items():
                yield (key, value)

        def __getattribute__(self, item):
            if item in object.__getattribute__(self, 'values'):
                return object.__getattribute__(self, 'values')[item]
            return object.__getattribute__(self, item)

        def validate_input(self, input_values):
            for field, value in input_values.items():
                if field in self.schema:
                    self.values[field] = value
实例化该类时,会传递一个dict值,然后将其验证并存储在“values”属性中。我希望直接从对象访问这些值,因此我设置了uuu getattribute,这是我想要的行为:

    m = Model({'foo': 'test', 'bar': 123})
    print(m.foo + ' ' + str(m.bar)) //prints "test 123"
这是可行的,但是我一定是误解了什么,因为当我尝试填充这些对象的列表,然后从列表中访问它们时,每个元素都返回相同的值。例如:

    people = [
        {'firstname': 'brian', 'lastname': 'smith'},
        {'firstname': 'adrian', 'lastname': 'holmes'},
        {'firstname': 'emily', 'lastname': 'mcleod'},
    ]

    test_models = []
    for person in people:
        m = Model({'foo': person['firstname'], 'bar': person['lastname']})
        test_models.append(m)

    for model in test_models:
        print(model.values)
将打印:

    {'foo': 'emily', 'bar': 'mcleod'}
    {'foo': 'emily', 'bar': 'mcleod'}
    {'foo': 'emily', 'bar': 'mcleod'}
我怀疑这与我在内部使用“object”的方式有关?或者我如何在循环中实例化模型类?

问题不在u\u getattribute\uu方法中。模型值属性是一个类属性,这意味着它与类相关,但与类的实例无关。每个模型实例使用相同的值

要解决问题,应将值从类移动到实例级别:

类别模型: 模式=[ "福",, “酒吧” ] 定义初始值,输入值=无: self.values={} 如果输入值不是无: self.validate\u inputinput\u值 定义调用self,*args,**kwargs: 如果args[0]不是无: self.validate_inputargs[0] 定义自身: 对于键,self.values.items中的值: 屈服键、屈服值 定义获取属性自身,项目: 如果对象中有项。\uuuu getattribute\uuuuu self,“值”: 返回对象。\uuuu getattribute\uuuu self,“值”[项] 返回对象。\uuuu getattribute\uuuuu self,项 def验证\输入自身,输入\值: 对于字段,输入值中的值。项: self.schema中的if字段: self.values[字段]=值 有关类和实例变量的更多信息,请参见