Python getattr()不带';类对象';

Python getattr()不带';类对象';,python,mysql,flask,Python,Mysql,Flask,在没有“类”的情况下如何使用getattr 所以我有这样的情况:我有一些“列”要求mysql按照特定的顺序提供特定的数据。数据通过flask/apache打印,以便用户能够操作这些数据。现在,从flask,POST Methd,我接收到更改的(?)值,并将它们存储在python属性中。我需要检查这些属性中的值是否与原始数据中的值相同。当然,我可以硬核它,但我想有可能改变列动态 columns = ["username", "email", "admin"] data = ("john", "jo

在没有“类”的情况下如何使用getattr

所以我有这样的情况:我有一些“列”要求mysql按照特定的顺序提供特定的数据。数据通过flask/apache打印,以便用户能够操作这些数据。现在,从flask,POST Methd,我接收到更改的(?)值,并将它们存储在python属性中。我需要检查这些属性中的值是否与原始数据中的值相同。当然,我可以硬核它,但我想有可能改变列动态

columns = ["username", "email", "admin"]
data = ("john", "john@snow.com", "True")

username = "john"
email = "different@email.com"
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")
一切都在flask中,我无法将其嵌入类本身。所以我没有“自我”等等。 如果我能创建类我可能会制作类似

class Myclass:
    def __init__(self):
        self.columns = ["username", "email", "admin"]
        self.data = ("john", "john@snow.com", "True")
        self.result = []
        self.username = "john"
        self.email = "different@email.com"
        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()
['same','different','different']

Flask只是Python代码。如果适合您的用例,您可以创建一个类并使用它。或者,如果您曾经管理数据库支持的数据,那么无论如何您都会有类和实例(并且可以更轻松地启动数据更新)

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

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

如果您坚持使用实例,请注意,在循环中,您希望将列和
数据
值压缩在一起:

for name, value in zip(columns, data):
    if getattr(self, name) == value:
        self.result.append("same")
    else:
        self.result.append("different")
请注意,您不必在前面添加“self”。整个
getattr()
的要点是执行与
语法相同的工作

您可能希望将
数据
列表作为字典放在一起:

因为不管怎样,这就是处理表单中的POST数据的方式;这样,您就可以迭代
dict.items()
对,或者只使用
列表访问值:

for name, value in self.data.items():
    # ...
或者使用
dict.get()
检索值,允许丢失条目:

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

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

很简单:

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

这个把戏是否省略了
“self.”+
。该属性名为
username
,而不是
self.username
。谢谢!为了清楚起见,我将对问题进行编辑:)如果您可以执行类似于
x=thing.attribute
,那么您也可以执行类似于
attribute\u name=“attribute”的操作;x=getattr(事物、属性和名称)
。这就是它的全部内容。@AlexHall,听起来不错,但是“东西”是什么呢?从字面上说,任何可以获得
thing.attribute
的东西。只需反复阅读评论。我强调最后一句话是有原因的。好吧,但我没有课,所以“自我”是undefined@tmdag例如你确实有一门课,你是说实例吗?如果你没有一个实例,你会用什么数据来比较呢?如果没有实例,那么您已经知道所有数据都是新的。@tmdag:如果您根本没有类,那么您要将现有数据存储在什么中以进行比较?如果您有字典,则只需使用
current\u data.get(name)
即可获取当前值(如果未设置,则使用
None
)。但是你在你的问题中使用了一个类和实例,Peters,一切都在烧瓶里。数据是从mysql提交到www的,然后我将数据取回。只有当来自www(post)的数据与最初的数据不同时,我才想更新mysql。好吧,我没有实例,我没有自我。我只想比较一下这些值,就像我在最上面的例子一样。我该怎么做呢?我只把课堂作为例子(为了清楚起见,我编辑了这个问题)。
for i in data:
  if i == eval(cols[data.index(i)]):
    print("it's the same")