Python-\uuuu getattribute\uuuuu在循环中中断填充列表
所以我想我误解了我的_ugetAttribute的实现。我创建了这个类: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
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[字段]=值
有关类和实例变量的更多信息,请参见