2016-11-24 75 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')。但是你在你的問題中使用了一個類和實例。 –

相關問題