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