2013-01-22 110 views
0

我正在創建一個Python類作爲通過REST遠程管理的對象的API。何時將屬性動態添加到Python對象是否合適?

REST API包含一個調用,該調用返回定義遠程對象屬性的字典列表。我正在編寫代碼來動態添加這些屬性作爲相應Python對象的屬性(即:當實例化類時,會爲屬性列表創建一個REST查詢,然後將其中的每個屬性添加爲屬性)

但是,這帶回了PHP代碼的記憶我曾經瞥過那些動態添加屬性的對象並思考「你聽說過字典嗎?」由於我的背景紮根於C/C++/Java,對我來說這是一個有點外國的想法,但也許是Python(和PHP)課程的標準。那麼,什麼時候適合動態地將屬性添加到對象而不是使用字典呢?

從我讀過的相關資料看來,API在我看來是合法的。

+1

無論如何,屬性表面上都存儲在一個名爲'__dict__'的字典中。 –

+0

我相信在Python中,如果鍵和值是同質的話,最好使用字典。如果要存儲每個鍵指向不同類型值的對象層次結構,請使用對象。也就是說,如果對象具有有意義的類型名稱,特別是在API文檔使用它們的情況下會更好。 (就像Google的API那樣。) – millimoose

+0

@WaleedKhan這不是我關心的存儲抽象。我想,這是編程實踐,適當的設計,並避免濫用語言功能。 – Matt

回答

2

免責聲明:我什麼都不知道REST ...

這麼說,我通常會有點猶豫屬性無可奈何地添加到對象,原因如下:

  • 你可能意外替換一些數據,你不想替換由於名稱空間衝突
  • 字典更容易檢查,而不是必須通過obj.__dict__vars(obj)或類似的東西。

有優先於標準庫添加屬性然而......這基本上是​​不填充返回namespace。我認爲也許值得提出這樣一個問題:「用戶是否知道哪些屬性將被添加到對象中?」。如果這個問題的答案是yes,並且你不擔心前面提到的命名空間衝突,那麼也許一個簡單的對象是合適的,否則,我只是使用一個字典。

+2

「argparse」和其他人使用的「名稱空間」對象的事情是,它們沒有其他屬性可以被替換,並且屬性名稱由用戶首先定義(因此內省是非發佈的) 。 – delnan

+0

我最終使用了一本字典,它也是如此 - 它允許我跟蹤對所有屬性的更改並將聚合更新發送到服務器。動態修改對象成員變得很快。 – Matt

0

在這樣的一個例子,我會更傾向於超載字典方法 - __getitem____setitem____delitem__keysvaluesitems,和其他任何可能適用。

如果您正式定義用Python表示數據的類,使用descriptors不是一個可讀性差的選項。

+0

我不確定我是否理解 - 是指這些字典方法適用於對象的__dict__屬性?我考慮過描述符,但是這仍然給我帶來了如何處理我的類中遠程檢索參數的問題。我應該動態地添加屬性()? – Matt

+0

@本人認爲你理解這個問題的方式是錯誤的。 OP不想僞造字典,他只是詢問對象或字典是否更適合他的用例。 – millimoose