Python 板


LINE

※ 引述《sbrhsieh (偶爾想擺爛一下)》之銘言: : ※ 引述《KSJ (阿真)》之銘言: : : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ : : 這句話就好像 在dictionary裡 有二個一樣的key : : 但裡面存著不同的東西 : : 不可思議 但在qgis的python console下真的存在@_@a : : 我目前的解決辨法是 類似於 前幾篇的文章中 : : "把instance放入instance的property中" : : 不過因為instance抓不到 所以也沒辨法抓到instance中的property : : 所以我就把 "instance放入比它自己還上一層的某個class的property中" : : (我想我說的class應該也是某個instance吧) : : 再去看它的 property 就是 我想要的instance了 : : 不過這的確會碰到 所謂的 每個instance都會不能清除的問題 : 如果你的需求是在任意時刻訪問一 class/type 的所有 live object,那麼 : globals() 回報的 mapping 裡有同名的現象(雖然我不認為會有)並無關緊要, http://imgur.com/BK9v7.png
這個是qgis下的python console 紅線是我的instance跟module同名部份 藍線是官方的plugin 也跟我的一樣有同名的instance跟module 似乎是qgis的python console裡才會發生的 不知道是什麼原因@_@ : live object 表示有一個以上的 strong reference 指向它,這些 strong : reference 在哪並不重要。 : 要達到你的需求,之前版友 Falldog 提供的作法加上 weakref module 的協助 : 就可以實做出一個可接受的方案: : from weakref import WeakValueDictionary : class foo(object): : __live_objects = WeakValueDictionary() : def __new__(cls, *args): : obj = super(foo, cls).__new__(cls, *args) : cls.__live_objects[id(obj)] = obj : return obj : def __init__(self, data=None): : self.data = data : @staticmethod : def visit_live_objects(visitor): : for x in foo.__live_objects.itervalues(): : visitor(x) 為了這個繼承於 "object" 我正在努力地看...orz http://www.cafepy.com/article/python_types_and_objects/ python_types_and_objects.html (短網址 http://0rz.tw/xy7NW) 不過裡面有用到object底下的東西嗎@_@? (我在字面上看不出來...) cls是什麼啊 囧 在我認知裡 class下的def 的第一個參數就是他自己(self) 用self來解釋似乎也通 關於 @staticmethod 看了一下官方文件 感覺是定義了class下的function 這讓我對 class 跟 instance 的適用時機 更混雜了 囧 : # demo code: : def dump(x): : print x.data, : A=map(foo, ('Item %d' % x for x in xrange(10))) : foo.visit_live_objects(dump) : # output: : # Item 7 Item 8 Item 0 Item 1 Item 2 Item 3 Item 4 Item 5 Item 9 Item 6 : del A[5:] : foo.visit_live_objects(dump) : # output: : # Item 3 Item 0 Item 2 Item 4 Item 1 : a = foo('PTT') : foo.visit_live_objects(dump) : # output: : # Item 3 PTT Item 0 Item 2 Item 4 Item 1 : a='ptt' : foo.visit_live_objects(dump) : # output: : # Item 3 Item 0 Item 2 Item 4 Item 1 到這裡我去查了weak reference... 稍稍了解他的用法(就像在此處的用法) 不過有沒有比較平常的例子?? 例如創了一個weak reference的變數,wref 這個變數感覺上用起來很不踏實 囧 因為wref參考的東西隨時可能不見 這樣的東西怎麼用呢 還是說要創weakreference的變數 必須先有strongreference(sref)才行 不然創了wref沒有sref不就可能一創完就被系統刪了?@@a 以下這裡也還在努力中... 連type都繼承了orz... 問不出疑惑或一些小結 因為還末消化.. 囧> 不過還是謝謝s大熱心講解 跟f大的觀念提供 <(_ _)> : 如果考慮到可能數個 class/type 都有此種需求,而且這個需求某種程度上也 : 算是一種通用的 feature,可以考慮寫成 meta class 來為多個 class 提供 : cache live object 的支援。 : 大致上如下: : class metaLiveObjectCache(type): : def __init__(cls, name, bases, attrs): : super(metaLiveObjectCache, cls).__init__(cls, name, bases, attrs) : setattr(cls, '_%s__live_objects' % cls.__name__, WeakValueDictionary()) : # hook __new__ : old_new = cls.__new__ : def proxy_new(klass, *args): : obj = old_new(klass, *args) : getattr(cls, '_%s__live_objects' % cls.__name__)[id(obj)] = obj : return obj : proxy_new.__name__ = old_new.__name__ : proxy_new.__doc__ = old_new.__doc__ : cls.__new__ = staticmethod(proxy_new) : # install static method: visit_live_objects : def visit_live_objects(visitor): : for x in getattr(cls, '_%s__live_objects' % cls.__name__).itervalues(): : visitor(x) : cls.visit_live_objects = staticmethod(visit_live_objects) : 前一例中的 foo class 可以簡化如下: : class bar(object): : __metaclass__ = metaLiveObjectCache : def __init__(self, data=None): : self.data = data 題外話 這裡看到了 foo 跟 bar 變數 就去查了一下... http://www.xoopscube.tw/modules/news/article.php?storyid=143 蠻微妙的 囧> --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.63.180
1F:→ yungyuc:sbrhsieh 教的是萬惡的 meta-classing,不好懂是應該的 11/30 23:24
2F:→ sbrhsieh:不會 meta-programming 並不會有什麼壞處吧? 12/01 01:13







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP