假設我們在內存中有很多對象。每個人都有一個獨特的ID。我如何迭代內存來查找與某個ID相比較的特定對象?爲了抓住它並通過getattr使用它?Python反射
Q
Python反射
4
A
回答
10
您應該維護這些對象的集合,因爲它們是在類屬性中創建的,然後提供用於檢索它們的類方法。
class Thing(object):
all = {}
def __init__(self, id, also, etc):
self.id = id
self.all[id] = self
@classmethod
def by_id(cls, id):
return cls.all[id]
0
你可以讓所有的新實例都訂閱了「註冊表」字典,與ID->對象的映射:
registry = {}
class MyClass(object):
def __init__(self, ...):
id = ...
registry[id] = self
MyClass.__all__ = registry
沿東西線這相當於其他可接受的解決方案(然而,另一個更爲'pythonic')。我已經用兩種方法改進了這種方法:1)可以爲註冊表創建一個自定義容器類,它允許您通過多個ID來進行查找; 2)你也可以創建一個自動添加代碼的元類,但如果你還需要其他元類的元類,這會變得很難看。
編輯:因爲其他的答案是可以接受的,加入的方式來分解出的設計模式
2
你可以問垃圾收集所有現有對象和遍歷該集合,找到你正在尋找的東西,但是那可能是錯誤的事情要做,除非你有非常特殊的理由去做。
+0
+1酷,我不知道。我不知道我會永遠有理由使用這個珍聞,但冷靜。 – dietbuddha 2011-04-17 04:42:25
0
首先給大家回答我非常感謝,我週末在我的心中是這樣的:
for ech in globals():
if str(type(globals()[ech])).find('instance') != -1:
if (globals()[ech].__dict__.has_key('onoma')):
print "%s, %s, %s"%(ech, globals()[ech].__dict__, id(globals()[ech]))
該做的工作,雖然我不知道這是好事還是不錯的辦法( 「onoma」是希臘字的名稱)。 我在Pyton的文檔中讀到:weakid的_id2obj_dict = weakref.WeakValueDictionary()。我也給了一個鏡頭。尼斯和ninjagecko我認爲很好的方法和類似。 但是在這種情況下,我怎麼能確定一個對象完全從內存中釋放出來?
相關問題
- 1. python中的反射
- 2. Python的超類反射
- 3. 在python中使用google protobuffers反射
- 4. 如何在Python中反向映射?
- 5. TypeLiteral注射反射
- 6. 反射
- 7. 反射
- 8. 反射
- 9. 反射
- 10. 反射
- 11. 計算漫反射(朗伯)反射
- 12. 對於射線追蹤折射/反射,不應該透射率+反射率= 1?
- 13. java反射投射問題
- 14. 射線追蹤 - 反射
- 15. GLSL中的反射映射
- 16. 反射是否違反LSP?
- 17. 單反的.NET反射器
- 18. 反射IllegalArgumentException java
- 19. 使用反射
- 20. 的Java反射
- 21. 使用反射
- 22. 反射梯度
- 23. 使用反射
- 24. 用HashMap反射
- 25. 使用反射
- 26. 通過反射
- 27. bash「反射」
- 28. 使用反射
- 29. 使用反射
- 30. 使用反射
你不知道。只要保持一個參考。這已經是主要實施中的標識,並且無論如何都是正確的(tm)。 – delnan 2011-04-16 13:23:21