[問題] Class的offset

看板Python作者 (xinu)時間17年前 (2008/08/03 01:50), 編輯推噓8(8017)
留言25則, 6人參與, 最新討論串1/2 (看更多)
請問一下在python裡 有辦法藉由class裡的某個member(attribute) 就找到該Class嗎? 假設c裡面是這樣寫的話 struct A { .... .... int a; //certain member }; struct A a; void *ptr = &a.a; ptr= ptr - ((struct A *)0)->a; ptr這時候會等於 &a; 這樣子的暴力手段python有辦法實作出來嗎? 或是有什麼其他替代方案? 我看introspection裡好像沒提到這段... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.168.200.162

08/03 16:01, , 1F
沒有
08/03 16:01, 1F

08/03 17:07, , 2F
thanks,所以python只能用指到struct指到頭的方式囉?
08/03 17:07, 2F

08/04 10:08, , 3F
有什麼理由一定要那樣寫@@?
08/04 10:08, 3F

08/04 13:25, , 4F
就算是 C ,最好也不要這樣寫吧;既難看又不跨平台
08/04 13:25, 4F

08/04 19:46, , 5F
Linux裡的list就是這樣寫的,沒人說過Linux難看又不跨平台吧..
08/04 19:46, 5F

08/04 19:48, , 6F
剛學Python,好奇在低階語言裡的東西Python有沒有對應的技術..
08/04 19:48, 6F

08/04 23:20, , 7F
我先收回不跨平台評語,但我真看不懂在寫啥,確定沒筆誤?
08/04 23:20, 7F

08/04 23:21, , 8F
C 要 list 也沒人會這樣寫吧...
08/04 23:21, 8F

08/05 01:15, , 9F
C在stddef.h有offsetof的macro
08/05 01:15, 9F

08/05 08:29, , 10F
python 就有 list 了, 需要自己搞一個嗎@@?
08/05 08:29, 10F

08/05 12:16, , 11F
offsetof 會寫在 stddef.h 就是因為各平台的寫法不同
08/05 12:16, 11F

08/05 23:15, , 12F
在C中這技巧很常見,尤其在 embedded 平台. 可以大幅簡化程式
08/05 23:15, 12F

08/05 23:18, , 13F
btw,python與C的哲學不同,用到這種設計通常表示出了問題,
08/05 23:18, 13F

08/05 23:19, , 14F
一定有更好的設計或方法取代
08/05 23:19, 14F

08/05 23:50, , 15F
這行明顯有誤,怎沒人提 ptr= ptr - ((struct A *)0)->a;
08/05 23:50, 15F

08/05 23:52, , 16F
有 offsetof 用,就乖乖用比較不會出錯,也可避掉平台問題
08/05 23:52, 16F

08/06 23:04, , 17F
我想不用stddef.h的原因是因為Linux Kernel不用C lib的定義
08/06 23:04, 17F

08/06 23:12, , 18F
應該是ptr-(void *)..原list.h寫的沒那麼粗糙
08/06 23:12, 18F

08/06 23:16, , 19F
剛好看到Linux裡的這段覺得很有趣, 想用剛學的Python作作看
08/06 23:16, 19F

08/06 23:18, , 20F
他這樣寫的好處應該是不需要Object之類的東西把大家串起來
08/06 23:18, 20F

08/08 00:31, , 21F
剛稍微看了這個 list.h ,果然是個精緻的設計;
08/08 00:31, 21F

08/08 00:36, , 22F
代碼高度可重用,空間效率也比經典的 C++ template 版本好
08/08 00:36, 22F

08/08 00:38, , 23F
不過這種用法在 Python 乃至 JAVA 上,都沒多大意義
08/08 00:38, 23F

08/08 00:47, , 24F
因這類語言原本就可只寫一套「演算法」來操作「各類資料」
08/08 00:47, 24F

08/08 01:17, , 25F
,且不會有 C/C++ macro 或 template 展開後變癡肥的問題
08/08 01:17, 25F
文章代碼(AID): #18b9vEvX (Python)
討論串 (同標題文章)
以下文章回應了本文
完整討論串 (本文為第 1 之 2 篇):
8
25
文章代碼(AID): #18b9vEvX (Python)