2016-11-24 20 views
1

如何使用getattr本身没有“Class”?getattr()没有'类对象'

所以我有这种情况:我有'列',要求特定的数据按特定顺序的MySQL。数据通过flask/apache打印,以便用户有能力操作这些数据。现在,从flask,POST methdd,我收到改变(?)值,我将它们存储在python属性中。我需要检查这些属性中的值是否与原始数据中的值相同。当然,我可以硬核它,但我希望有动态更改列的可能性。

columns = ["username", "email", "admin"] 
data = ("john", "[email protected]", "True") 

username = "john" 
email = "[email protected]" 
admin = False 

不知道我该怎么办呢?

for i in data: 
    if i == getattr(???, 'username'): 
    print("it's the same") 

或这样的事情?:

for i in data: 
    if i == getattr(data, '?????'): 
    print("it's the same") 

一切都是烧瓶内,我不能把它嵌入到类本身。所以,我没有“自我”等 如果我可以创建类,我可能会做出类似

class Myclass: 
    def __init__(self): 
     self.columns = ["username", "email", "admin"] 
     self.data = ("john", "[email protected]", "True") 
     self.result = [] 
     self.username = "john" 
     self.email = "[email protected]" 
     self.admin = False 

    def test(self): 
     for i in self.data: 
      if i == getattr(self, self.columns[self.data.index(i)]): 
       self.result.append("same") 
      else: 
       self.result.append("different") 
     return self.result 

Myclass().test() 

[“同”,“不同”,“不同”]

+0

离开了' “自我”。 +'。该属性被称为“用户名”,而不是“self.username”。 –

+0

谢谢!为了清晰起见,我将编辑问题:) – tmdag

+0

如果你可以做类似'x = thing.attribute'的东西,那么你也可以做一些像'attribute_name =“attribute”; x = getattr(thing,attribute_name)'。 ***这就是它的全部。*** –

回答

0

原来,我正在寻找简单的eval()。 getattr()是为不同目的而设计的。

那么简单:

for i in data: 
    if i == eval(cols[data.index(i)]): 
    print("it's the same") 

的伎俩

1

瓶是只是Python代码。你可以创建一个类并使用它来适应你的用例。或者,如果您使用Flask-SQLAlchemy来管理数据库支持的数据,那么您将拥有类和实例(并且可以更轻松地启动数据更新)。

类和实例不是唯一具有属性的对象;模块和函数也具有属性(尽管不会将数据存储为其中任何一个的属性),并且当您查找任何方法时,您也正在查找属性也是

选择一个存储,然后用该类的一个实例包装该存储,然后使用getattr(),或者选择其他数据结构并使用该数据结构的方法来获取不同的字段。举个例子,一本字典会使给定名字的当前值变得微不足道。

如果你坚持的情况下,则请注意,在循环你要压缩的列和data值加在一起:

for name, value in zip(columns, data): 
    if getattr(self, name) == value: 
     self.result.append("same") 
    else: 
     self.result.append("different") 

注意,你不必在前面加"self.",则getattr()的整点与.语法所做的工作相同。

你可能想要把你columnsdata列表一起作为一个字典

self.data = {'username': 'john', 'email': '[email protected]', 'admin': 'True'} 

,因为这是你如何会处理来自反正表单POST数据;这样你可以遍历dict.items()双,或只使用columns列表访问值:

for name, value in self.data.items(): 
    # ... 

或使用dict.get()检索值,允许缺少的条目:

for name in self.columns: 
    if getattr(self, name) == self.data.get(name): 
     # ... 
+0

好吧,但我没有一个类,所以'自我'是undefined – tmdag

+0

@tmdag:你*有*有一个类,你的意思是*实例*也许?如果你没有*实例*,那么你会将这些数据与哪些数据进行比较?如果没有实例,那么你*已经知道*所有的数据都是新的。 –

+0

@tmdag:如果您根本没有课程,那么您现在的数据存储在哪里以便与之比较?如果你有一个字典,那么只需使用'current_data.get(name)'来获得当前值(如果没有设置,则使用'None')。但是你在你的问题中使用了一个类和实例。 –