builtin-dir-example.py

# -*- coding: utf-8 -*-

# @File    : builtin-dir-example.py
# @Date    : 2018-09-20
# @Author  : Peng Shiyu

# dir返回成员列表
import sys

def dump(value):
    print(value, "=>", dir(value))

dump(0)
dump(1.0)
dump(1.0j)  # complex
dump({})  # dictionary
dump([])  # list
dump("string")
dump(len)  # function
dump(sys)  # module
"""
(0, '=>', ['__abs__', '__add__', '__and__', '__class__', '__cmp__', 
'__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', 
'__float__', '__floordiv__', '__format__', '__getattribute__', 
'__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', 
'__int__', '__invert__', '__long__', '__lshift__', '__mod__', 
'__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', 
'__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', 
'__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', 
'__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', 
'__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', 
'__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', 
'__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real'])

(1.0, '=>', ['__abs__', '__add__', '__class__', '__coerce__', 
'__delattr__', '__div__', '__divmod__', '__doc__', '__eq__', 
'__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', 
'__getformat__', '__getnewargs__', '__gt__', '__hash__', '__init__', 
'__int__', '__le__', '__long__', '__lt__', '__mod__', '__mul__', 
'__ne__', '__neg__', '__new__', '__nonzero__', '__pos__', '__pow__', 
'__radd__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', 
'__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rsub__', 
'__rtruediv__', '__setattr__', '__setformat__', '__sizeof__', '__str__', 
'__sub__', '__subclasshook__', '__truediv__', '__trunc__', 'as_integer_ratio',
 'conjugate', 'fromhex', 'hex', 'imag', 'is_integer', 'real'])
 
(1j, '=>', ['__abs__', '__add__', '__class__', '__coerce__', 
'__delattr__', '__div__', '__divmod__', '__doc__', '__eq__', '__float__', 
'__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', 
'__gt__', '__hash__', '__init__', '__int__', '__le__', '__long__', '__lt__', 
'__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__nonzero__', '__pos__', 
'__pow__', '__radd__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', 
'__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rsub__', 
'__rtruediv__', '__setattr__', '__sizeof__', '__str__', '__sub__', 
'__subclasshook__', '__truediv__', 'conjugate', 'imag', 'real'])

({}, '=>', ['__class__', '__cmp__', '__contains__', '__delattr__', 
'__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', 
'__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', 
'__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
'__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', 
'__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 
'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 
'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues'])

([], '=>', ['__add__', '__class__', '__contains__', '__delattr__', 
'__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', 
'__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', 
'__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', 
'__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', 
'__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 
'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'])

('string', '=>', ['__add__', '__class__', '__contains__', '__delattr__', 
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', 
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', 
'__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', 
'__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split',
 '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 
 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 
 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 
 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 
 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 
 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'])
 
(<built-in function len>, '=>', ['__call__', '__class__', '__cmp__',
 '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', 
 '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__name__', 
 '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', 
 '__setattr__', '__sizeof__', '__str__', '__subclasshook__'])
 
(<module 'sys' (built-in)>, '=>', ['__displayhook__', '__doc__', 
'__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', 
'__stdout__', '_clear_type_cache', '_current_frames', '_getframe', 
'_mercurial', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 
'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 
'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 
'exit', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval', 
'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 
'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 
'gettrace', 'hexversion', 'long_info', 'maxint', 'maxsize', 
'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 
'path_importer_cache', 'platform', 'prefix', 'py3kwarning', 
'real_prefix', 'setcheckinterval', 'setdlopenflags', 'setprofile', 
'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 
'version', 'version_info', 'warnoptions'])

Process finished with exit code 0

"""

# 使用dir 函数查找类的所有成员

class A(object):
    def a(self):
        pass

    def b(self):
        pass

class B(A):
    def c(self):
        pass

    def d(self):
        pass

def get_members(klass, members=None):
    if members is None:
        members = []

    # 基类中查找成员
    for k in klass.__bases__:
        get_members(k, members)

    # 本类中查找成员
    for m in dir(klass):
        if m not in members:
            members.append(m)

    return members

print(get_members(B))
# 成员在列表中名称出现的越早, 它所处的类层次就越高
"""
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', 
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__dict__', 
'__module__', '__weakref__', 'a', 'b', 'c', 'd']
"""

print(B.__bases__)
# (<class '__main__.A'>,)