dir函数在 Python 中是一个非常实用的内置函数,它可以在多种场景下被使用。常见应用场景有:
1、交互式探索:当你在Python交互式解释器或Jupyter Notebook中工作时,dir()函数可以帮助你快速了解一个对象有哪些属性和方法。尤其是你刚开始使用一个新的库或模块时特别有用。
2、检查对象的属性和方法:对于自定义的类或对象,你可以使用 `dir()` 来检查它们的属性和方法。
3、结合getattr和setattr使用:当你想要动态地获取或设置对象的属性时,可以组合使用dir()、getattr()和setattr()三个函数。其中,getattr()用于获取对象的属性值,而setattr()用于设置对象的属性值。
4、自动化测试和文档生成:在编写自动化测试或生成文档时,dir()函数可以帮助你获取对象的所有属性和方法,从而可以编写更全面的测试用例或生成更完整的文档。
5、调试和排查:当你遇到对象的行为不符合预期时,可以使用dir()函数来检查对象的属性或方法是否存在或是否已被正确设置。
6、过滤和排序属性:dir()函数返回的是一个包含所有属性和方法名称的列表,你可以使用 Python 的列表操作来过滤和排序这些属性。例如,你可能只对类的方法感兴趣,并希望按字母顺序对它们进行排序。
7、自定义 `__dir__` 方法:对于自定义的类,你可以通过实现 `__dir__` 方法来定制 dir()函数的行为。这允许你控制哪些属性或方法应该被dir()函数列出。
8、元编程和动态类型检查:dir()函数可以用来检查对象是否实现了特定的接口或遵循了某些约定,这对于构建灵活且可扩展的系统非常有用。
总之,了解并掌握这些用法和技巧,可以帮助你更高效地利用dir()函数,并在 Python 编程中更深入地理解对象和其结构。然而,也要注意不要过度依赖dir(),因为过度使用可能会使代码变得难以阅读和维护。
1、dir函数:
1-1、Python:
# 1.函数:dir
# 2.功能:获取名字或属性、方法的列表
# 3.语法:dir([object])
# 4.参数:object,对象,可选。Python内置了一些基本的对象类型,包括但不限于:
# 4-1、 数字(Numbers):
# int:整数
# float:浮点数
# complex:复数
# 4-2、 序列(Sequences):
# list:列表,可以包含任意类型的元素
# tuple:元组,与列表类似但不可变
# str:字符串,字符序列
# bytes:字节序列
# bytearray:可变字节序列
# memoryview:内存视图,是原始数据的不同解释
# 4-3、集合(Sets):
# set:无序且不包含重复元素的集合
# frozenset:不可变的集合
# 4-4、映射(Mappings):
# dict:字典,键值对映射
# 4-5、布尔值(Booleans):
# bool:布尔类型,只有两个值:True和False
# 4-6、类型(Types):
# type:类型对象,用于描述其他对象的数据类型
# 4-7、其他内置类型:
# NoneType:只有一个值None,表示空或没有值
# ellipsis:...,通常用于切片操作或表示省略
# slice:表示切片对象,用于切片操作
# range:表示不可变的整数序列,通常用于循环
# property:用于获取、设置或删除属性的内置装饰器类型
# function:函数对象
# method:方法对象,即绑定到类实例的函数
# classmethod和staticmethod:特殊的方法类型,分别表示类方法和静态方法
# module:模块对象
# traceback、frame和code:与异常和调试相关的对象
# 5.返回值:
# 5-1、无实参:返回当前本地作用域中的名称列表
# 5-2、有实参:返回所有属性和方法,甚至是所有对象默认的内置属性
# 6.说明:
# 6-1、返回列表的顺序:dir()函数返回的列表并不保证特定的顺序。这意味着,每次调用dir()函数时,即使是对同一个对象,返回的属性列表的顺序也可能不同。
# 因此,不应该依赖dir()函数返回的顺序进行任何逻辑操作。
# 6-2、包含的内容:dir()函数返回的列表包含了对象的所有属性,包括方法、变量、模块等。这包括了一些可能并不直接对用户有用的特殊方法(如`__init__`、`__call__`等)或内部使用的属性。
# 因此,在使用dir()函数返回的结果时,通常需要过滤出你真正关心的属性。
# 6-3、动态属性:如果对象在运行时动态地添加或删除了属性,那么dir()函数的结果也会相应地改变。这意味着,如果你在一个时间点调用了dir(),
# 然后在另一个时间点再次调用,结果可能会有所不同。
# 6-4、私有属性:虽然dir()函数会返回对象的所有属性,包括以单个下划线`_`开头的“保护”属性和以双下划线`__`开头的“私有”属性,但通常不建议直接访问这些属性,
# 因为它们可能是类内部使用的,并且可能在未来的版本中发生变化。
# 6-5、继承的属性:如果对象是从其他类继承的,那么dir()函数返回的列表也会包括继承的属性。这意味着,你可能需要过滤掉一些你不关心的、从父类继承的属性。
# 6-6、性能考虑:对于大型对象或复杂的对象结构,dir()函数可能会花费一些时间来收集所有的属性。在性能敏感的应用中,频繁调用dir()函数可能会对性能产生负面影响。
# 6-7、替代方法:在某些情况下,你可能不需要使用dir()函数。例如,如果你只是想知道一个对象是否有一个特定的属性或方法,可以使用hasattr()函数;
# 同样,你可以使用getattr()来获取一个属性的值,或者使用setattr()来设置一个属性的值。
# 7.示例:
# 应用1:交互式探索
import pandas as pd
print(dir(pd))
# ['ArrowDtype', 'BooleanDtype', 'Categorical', 'CategoricalDtype', 'CategoricalIndex', 'DataFrame', 'DateOffset',
# 'DatetimeIndex', 'DatetimeTZDtype', 'ExcelFile', 'ExcelWriter', 'Flags', 'Float32Dtype', 'Float64Dtype', 'Grouper',
# 'HDFStore', 'Index', 'IndexSlice', 'Int16Dtype', 'Int32Dtype', 'Int64Dtype', 'Int8Dtype', 'Interval', 'IntervalDtype',
# 'IntervalIndex', 'MultiIndex', 'NA', 'NaT', 'NamedAgg', 'Period', 'PeriodDtype', 'PeriodIndex', 'RangeIndex', 'Series',
# 'SparseDtype', 'StringDtype', 'Timedelta', 'TimedeltaIndex', 'Timestamp', 'UInt16Dtype', 'UInt32Dtype', 'UInt64Dtype',
# 'UInt8Dtype', '__all__', '__builtins__', '__cached__', '__doc__', '__docformat__', '__file__', '__git_version__',
# '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_built_with_meson', '_config',
# '_is_numpy_dev', '_libs', '_pandas_datetime_CAPI', '_pandas_parser_CAPI', '_testing', '_typing', '_version_meson',
# 'annotations', 'api', 'array', 'arrays', 'bdate_range', 'compat', 'concat', 'core', 'crosstab', 'cut', 'date_range',
# 'describe_option', 'errors', 'eval', 'factorize', 'from_dummies', 'get_dummies', 'get_option', 'infer_freq',
# 'interval_range', 'io', 'isna', 'isnull', 'json_normalize', 'lreshape', 'melt', 'merge', 'merge_asof', 'merge_ordered',
# 'notna', 'notnull', 'offsets', 'option_context', 'options', 'pandas', 'period_range', 'pivot', 'pivot_table', 'plotting',
# 'qcut', 'read_clipboard', 'read_csv', 'read_excel', 'read_feather', 'read_fwf', 'read_gbq', 'read_hdf', 'read_html',
# 'read_json', 'read_orc', 'read_parquet', 'read_pickle', 'read_sas', 'read_spss', 'read_sql', 'read_sql_query',
# 'read_sql_table', 'read_stata', 'read_table', 'read_xml', 'reset_option', 'set_eng_float_format', 'set_option',
# 'show_versions', 'test', 'testing', 'timedelta_range', 'to_datetime', 'to_numeric', 'to_pickle', 'to_timedelta',
# 'tseries', 'unique', 'util', 'value_counts', 'wide_to_long']
import math
print(dir(math))
# ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2',
# 'atanh', 'cbrt', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'exp2',
# 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite',
# 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter',
# 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
import cmath
print(dir(cmath))
# ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh',
# 'cos', 'cosh', 'e', 'exp', 'inf', 'infj', 'isclose', 'isfinite', 'isinf', 'isnan', 'log', 'log10', 'nan', 'nanj',
# 'phase', 'pi', 'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau']
# 应用2:检查对象的属性和方法
class MyClass:
def __init__(self):
self.my_var = 42
def my_method(self):
print("This is a method.")
obj = MyClass()
print(dir(obj))
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
# '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__',
# '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
# '__weakref__', 'my_method', 'my_var']
# 应用3:结合getattr和setattr使用
class MyClass:
def __init__(self):
self.my_var = 42
if __name__ == '__main__':
obj = MyClass()
for attr in dir(obj):
if not attr.startswith('__'): # 排除特殊方法或属性
value = getattr(obj, attr)
print(f"{attr}: {value}")
# 设置属性
setattr(obj, 'new_var', 100)
# my_var: 42
# 应用4:自动化测试和文档生成
import math
def write_module_docs(module):
with open('module_docs.txt', 'w') as f:
f.write(f"Attributes and methods in {module.__name__}:\n")
for attr in dir(module):
if not attr.startswith("_"): # 排除私有属性
f.write(f"- {attr}\n")
if __name__ == '__main__':
write_module_docs(math) # 为math模块生成文档
# 应用5:调试和排查
print(dir(complex))
# ['__abs__', '__add__', '__bool__', '__class__', '__complex__', '__delattr__', '__dir__', '__doc__', '__eq__',
# '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__getstate__', '__gt__', '__hash__', '__init__',
# '__init_subclass__', '__le__', '__lt__', '__mul__', '__ne__', '__neg__', '__new__', '__pos__', '__pow__', '__radd__',
# '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__',
# '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', 'conjugate', 'imag', 'real']
# 应用6:过滤和排序属性
class MyClass:
def method1(self):
pass
def method2(self):
pass
if __name__ == '__main__':
methods = [attr for attr in dir(MyClass) if callable(getattr(MyClass, attr)) and attr.startswith('method')]
methods.sort()
print(methods)
# ['method1', 'method2']
# 应用7:自定义 `__dir__` 方法
class MyClass:
def __init__(self):
self.a = 3
self.b = 5
self.c = 10
def __dir__(self):
return ['a', 'c']
if __name__ == '__main__':
obj = MyClass()
print(dir(obj))
# ['a', 'c']
# 应用8:元编程和动态类型检查
# 元编程
class MyClass:
def __init__(self):
self.attribute1 = "Hello"
self.attribute2 = "Python"
def method1(self):
print("This is method 1")
def method2(self):
print("This is method 2")
# 主函数
if __name__ == '__main__':
obj = MyClass()
# 使用dir函数获取对象的所有属性和方法
attributes_and_methods = dir(obj)
# 打印所有属性和方法
print("Attributes and methods of MyClass instance:")
for item in attributes_and_methods:
print(item)
# Attributes and methods of MyClass instance:
# __class__
# __delattr__
# __dict__
# __dir__
# __doc__
# __eq__
# __format__
# __ge__
# __getattribute__
# __getstate__
# __gt__
# __hash__
# __init__
# __init_subclass__
# __le__
# __lt__
# __module__
# __ne__
# __new__
# __reduce__
# __reduce_ex__
# __repr__
# __setattr__
# __sizeof__
# __str__
# __subclasshook__
# __weakref__
# attribute1
# attribute2
# method1
# method2
#动态类型检查
def is_instance_of_class(obj, class_name):
# 获取对象的所有属性和方法
obj_attributes = dir(obj)
# 获取类的所有属性和方法
class_attributes = dir(class_name)
# 检查对象的所有属性和方法是否都是类的属性和方法的子集
return set(obj_attributes).issubset(set(class_attributes))
class MyClass:
pass
if __name__ == '__main__':
obj = MyClass()
# 检查obj是否是MyClass的实例
if is_instance_of_class(obj, MyClass):
print("obj is an instance of MyClass")
else:
print("obj is not an instance of MyClass")
# obj is an instance of MyClass
1-2、VBA:
略,待后补。
2、相关文章:
2-1、Python-VBA函数之旅-bytes()函数
2-2、Python-VBA函数之旅-callable()函数
2-3、Python-VBA函数之旅-classmethod()函数
2-4、Python-VBA函数之旅-compile()函数
Python算法之旅:Algorithm
Python函数之旅:Functions