2015-05-30 77 views
1

這更多的是「技術」的問題。我正在嘗試在Python中創建一個具有一定數量變量的類。什麼是存儲它們的最佳方式?如何最好地將多個字段添加到對象

我想某種結構的,讓我能迅速地檢索值,而無需編寫更多的功能:

a = myclass() 
a.add('name','John') 
a.add('age',30) 
b = myclass() 
b.add('a complete different attribute','value') 

然後:

print a.name 
John 

print a.retrieve('name') 
John 

我知道我可以做到這一點,當我添加和wr時,在類中填充兩列列表迭代一個檢索某個值的函數。但是我想知道Python是否已經內置了一些東西,所以讀代碼簡化了。

感謝

+1

'GETATTR()','SETATTR()'將讓你得到和一次設置一個字段。沒有辦法在一次調用中添加多個字段,但可以使用'operator.attrgetter('name','age')(a)'來獲取多個值。 –

+0

感謝Ashwini!這非常接近我所需要的! (如果你粘貼你的答案作爲下面的答案,我可以將其標記爲正常) – Yona

+0

謝謝大家!我認爲二傳手和字典方法都很好。也許字典更適合我的需求,因爲我可能有數百個變量,而且我不想擁有object.my10000變量!所以也許把所有內容都放在dic {}裏是最乾淨的實現。 – Yona

回答

1

可以使類有一本字典的變量,並添加將不斷加入到該字典變量,然後就可以使用a.dictvariable['<your variable>']。字典是存儲鍵:值對的數據結構。

例(python3):

class MyClass: 
    def __init__(self): 
     self.dict = {} 

    def add(self, name, val): 
     self.dict[name] = val 

    def get(self, name): 
     self.dict.get(name) 

然後你可以使用你的代碼爲:

a = MyClass() 
a.add('name','John') 
a.add('age',30) 
b = MyClass() 
b.add('a complete different attribute','value') 
print(a.get('name')) 
print(b.get('a complete different attribute')) 

使用dict.get,將確保,如果 '名' 不存在的字典,它返回null。訪問字典變量的另一種方法是 -

dict['name']

這將返回值存儲在該字典「名稱」鍵。 但是,如果字典中不存在「名稱」,它會拋出KeyError

或者,你可以使用setattr(),如下圖所示:

class MyClass: 
    pass 

a = MyClass() 
setattr(a, 'name', 'John') 
print(a.name) 

或者你可以在MyClass的創建自己的warpper功能,這反過來將調用setattr()。例如:

class MyClass: 
    def add(self, name, val): 
     setattr(self, name, val) 

a = MyClass() 
a.add('name','John') 
print(a.name) 
0

如果我理解正確,您正在尋找「getter和setter方法」,因爲它們通常在OO中調用。幸運的是,它們內置於python類中!

class A: 
    pass 
dir(A) 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

__getattribute____setattr__是私有方法的名稱,你可以通過調用GETATTR和SETATTR你的類的實例調用它們,就像這樣:

a = A() 
setattr(a, "foo", "bar") 
print(a.foo) 
bar 
getattr(a, "foo", None) 
'bar' 

的第二個參數getattr的是確保變量foo的默認值 - None是默認值。

HTH

0

是不是Python中字典的定義?

a = {} 
a['name'] = 'John' 
a['age'] = 30 
b = {} 
b['a complete different attribute'] = 'value' 

這種技術是高度優化的:指數是散列,因此非常快。你可以 '隱藏' 的字典:

class myclass(dict): 
    def __init__(self): 
     self = {} 

    def add(self, key, el): 
     self[key] = el 

    def retrieve(self, key): 
     return self[key] 

def main(): 
    a = myclass() 
    a.add('name','John') 
    a.add('age',30) 
    b = myclass() 
    b.add('a complete different attribute','value') 

    print(a.retrieve('name')) 

    return 0 
if __name__ == '__main__': 
    main() 

*

相關問題