【问题标题】:getattr() without 'class object'getattr() 没有“类对象”
【发布时间】:2016-11-24 10:17:19
【问题描述】:

我如何在没有“Class”的情况下使用 getattr ?

所以我遇到了这种情况:我有“列”以特定顺序向 mysql 询问特定数据。数据通过flask/apache打印,以便用户能够操作这些数据。现在,从烧瓶,POST methdd,我收到更改(?)值并将它们存储在 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")

一切都在烧瓶中,我无法将其嵌入到类本身中。所以我没有“自我”等。 如果我可以创建类,我可能会做类似的东西

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()

['相同','不同','不同']

【问题讨论】:

  • 省略"self." + 。该属性称为username,而不是self.username
  • 谢谢!为了清楚起见,我将编辑问题:)
  • 如果你能做x = thing.attribute之类的事情,那么你也可以做attribute_name = "attribute"; x = getattr(thing, attribute_name)之类的事情。 仅此而已。
  • @AlexHall,听起来不错,但“东西”会是什么?
  • 字面意思是任何可以获得thing.attribute的东西。一遍又一遍地阅读评论。我强调最后一句话是有原因的。

标签: python mysql flask


【解决方案1】:

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

这么简单:

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

成功了

【讨论】:

    【解决方案2】:

    Flask 只是 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': 'john@snow.com', '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):
            # ...
    

    【讨论】:

    • 好吧,但是我没有类,所以'self'是未定义的
    • @tmdag:你确实有一个类,你的意思是instance吗?如果您没有instance,您打算将其与哪些数据进行比较?如果没有实例,那么您已经知道所有数据都是新的。
    • @tmdag:如果您根本没有课程,您将现有数据存储在什么中以进行比较?如果您有字典,则只需使用 current_data.get(name) 获取当前值(或 None 如果未设置)。但是您在问题中使用了类和实例。
    • Peters 一切都在烧瓶中。数据来自mysql,转到www,然后我正在取回数据。仅当来自 www(post)的数据与原始数据不同时,我才想更新 mysql。好的,我没有实例,我没有“自我”。我想要的只是比较这些值,就像我在最上面的例子一样。我该如何处理它?
    • 我只使用了类作为示例(为了清楚起见,我已经编辑了问题)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2017-12-21
    • 2020-02-03
    • 1970-01-01
    • 2016-06-03
    • 2021-03-20
    相关资源
    最近更新 更多