Re: [問題] 迭代物件中的所有非私有方法和欄位?

作者: uranusjr (←這人是超級笨蛋)   2017-06-23 17:09:29
→ uranusjr: __dict__ 06/23 14:57
→ uranusjr: 漏看要對內建型別也有用, 這樣 global dir() 比較好 06/23 14:58
: 可是u大 dir後要怎樣過濾方法還是屬性呢
最正規的答案是沒有辦法, 因為 Python 沒有在分...
假設你有個 class 長這樣
class A:
def __init__(self):
self.x = 0
def f(self):
print('hi')
你可能會想說 x 是屬性, f 是方法
但事情並沒有這麼簡單
如果我這樣...
class A:
def __init__(self):
self.x = 0
self.y = self.f
def f(self):
print('hi')
那麼 y 是屬性嗎?但它和 f 的行為完全一樣
所以你根本分不出來...
所以你必須想好你真的想要的是什麼
如果你想知道的是「哪些屬性可以被呼叫」
那麼你可以用 callable() 函式
>>> a = A()
>>> callable(a.f)
True
>>> callable(a.x)
False
>>> callable(a.y)
True
如果你想知道哪些屬性是 function (不包含 class 和有定義 __call__ 的物件)
可以用 inspect.isfunction()
如果你想要知道哪些屬性是 method (只包含有 bound 到某個 instance 的 function)
那就用 inspect.ismethod()
還有一些其他微妙差異就交給你自己發現
另外如果你打算用 inspect
可以考慮搭配 inspect.getmembers() 的 predicate 省一些功夫
作者: uranusjr (←這人是超級笨蛋)   2016-06-23 14:57:00
__dict__漏看要對內建型別也有用, 這樣 global dir() 比較好
作者: LessonWang (橘白Cat)   2017-06-23 18:34:00
非常感謝u大 被開導了一課xd推詳細說明
作者: akasan (KITO)   2017-11-02 00:43:00
valgrind, 但 windowns 版的沒試過XDlinux 上那真的是不二選擇了
作者: Linux (Windows)   2017-11-02 00:45:00
我是用 Windows ....>"<

Links booklink

Contact Us: admin [ a t ] ucptt.com