📌  相关文章
📜  获取对象python的所有属性(1)

📅  最后修改于: 2023-12-03 15:41:27.921000             🧑  作者: Mango

获取Python对象的所有属性

在Python中,我们可以使用内置的dir()函数来获取一个对象的所有属性(方法、变量等)列表。但是,这个函数会列出所有可见属性,包括内置的和对象自身的属性。因此,我们需要进行一些过滤才能得到我们真正需要的属性。

1. 使用dir()函数获取所有属性

下面是一个简单的例子,使用dir()函数列出字符串对象的所有属性:

>>> string = "Hello, World!"
>>> dir(string)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

上面的输出结果中包含了许多带下划线的属性,这些属性大部分是Python的内置属性,不是我们实际需要的。因此,我们需要进行一些过滤。

2. 使用列表推导式过滤属性

我们可以使用列表推导式过滤出我们需要的属性。例如,如果我们只需要字符串对象的方法属性,可以按下面的方式进行过滤:

>>> [attr for attr in dir(str) if callable(getattr(str, attr))]
['capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

上面的输出结果只包含了字符串方法,没有杂项属性。

3. 使用dir()函数配合标准库的inspect模块

除了使用列表推导式外,我们还可以使用dir()函数配合内置的inspect模块来得到更详细的属性信息。inspect模块提供了一些工具来解析对象的源代码,包括得到属性的类型、定义文件、文档字符串等。

下面是使用dir()函数配合inspect模块获取字符串对象方法属性信息的例子:

import inspect

string = "Hello, World!"

# 获取方法属性列表
methods = [attr for attr in dir(str) if callable(getattr(str, attr))]

# 获取方法属性信息
method_info = []
for method in methods:
    obj = getattr(string, method)
    name = obj.__name__
    argspec = inspect.getfullargspec(obj)
    argnames = argspec.args[1:]
    doc = obj.__doc__

    method_info.append((name, argnames, doc))

# 输出方法属性信息
for name, argnames, doc in method_info:
    print(f"{name}: {', '.join(argnames)}\n{doc}\n")

输出结果:

capitalize:
Return a capitalized version of the string, i.e. make the first character
have upper case and the rest lower case.

casefold:
Return a version of the string suitable for caseless comparisons.

    More specifically, return a lowercase version of the string with all
    case distinctions removed. This is used for case-insensitive comparisons
    of Unicode characters and will produce correct results for any Unicode
    character that has a case folding, which is broader than just the
    ASCII characters.

center: (width[, fillchar])
Return centered in a string of length width. Padding is
done using the specified fillchar (default is a space).

count: (sub[, start[, end]])
Return the number of non-overlapping occurrences of substring sub in
string[start:end].  Optional arguments start and end are
interpreted as in slice notation.

...

translate: (table)
Replace each character in the string using the given translation table.

upper:
Return a copy of the string with all the cased characters converted to uppercase.
总结

本文介绍了两种获取Python对象属性的方法:使用dir()函数配合列表推导式和使用dir()函数配合inspect模块。其中,第二种方法可以得到更详细的属性信息,包括方法的参数和文档字符串等。对于提高调试能力和编写类库文档等方面都有帮助。