Python-VBA函数之旅-dir函数

news2024/9/22 13:25:56


        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 

个人主页:非风V非雨-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1596741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何通过Linux pciehp sysfs接口控制PCIe Slot电源状态?-3

pciehp sysfs接口电源控制与NVME驱动卸载的区别 从NVMe SSD设计本身而言,当通过pciehp sysfs接口对PCIe插槽执行Power Off操作时,由于NVMe SSD作为PCIe设备,其电源供应是直接依赖于所连接的PCIe插槽提供的。当插槽电源被关闭时,会…

HTML5 新增语义标签及属性

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍HTML5 新增语义标签及属性💎1 HTML5 新增的块级语义化标签&…

查看 Linux 接入的 USB 设备速率是 USB2 还是 USB3

查看接入 usb 设备的速率 使用以下命令查看接入的 USB 设备速率(每一行最后的 xxM 字样)。插入设备前查看一次,插入设备后查看一次,对比即可定位到刚插入的设备是哪一条。 lsusb -t命令输出如下图 对照 USB 速率表 对照 USB 速…

网络基础(二)——传输层

1、再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序; 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n查看); 1.1、端口号…

java:多线程

多线程 在java程序中同时执行多个线程,每个线程独立执行不同的任务. 可以提高程序的性能和资源利用率,增加程序的并发性. 多线程的作用 1,提高程序性能 可以将一个任务分解成多个子任务并行处理,从而提高程序的运行速度 2,提高资源利用率 可以更好地利用CPU资源,提高CPU…

从0到1,六步搭建AI智能客服机器人

现如今,智能客服机器人成为了企业提升服务效率、优化客户体验的重要工具。它不仅可以24小时不间断地为客户提供服务,还减少人工成本。那么,如何从零开始搭建一个AI智能客服机器人呢?本文将为您简要介绍几个关键步骤。 一、明确需求…

Mybatis generate xml 没有被覆盖

添加插件即可 <plugin type"org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

51单片机学习笔记——点亮数码管、模块化编程

工作原理图 138译码器 G1、G2A、G2B为138译码器的使能端 P22、P23、P24为输入口控制Y0-Y7的动作&#xff0c;以二进制的算法 具体如下&#xff1a; P22 P23 P24 0 0 0 Y0为1其余为0 0 0 1 Y1为1其余为0 0 1 0 Y2…

【香橙派zero3蓝牙串口wifi配网教程】

【香橙派zero3蓝牙串口wifi配网教程】 1. 简介2. 准备工作2.1 zero3串口5开启2.2 硬件连接 3. 配网步骤3.1 连接串口3.2 打开串口终端3.3 运行配网脚本3.4 输入WiFi信息 4. 注意事项5. 总结 1. 简介 香橙派Zero3是一款基于H618处理器的单板计算机&#xff0c;具有丰富的接口和…

Itasca pfc3d/3dec/flac3d/massflow 9.0 授权

所有 Itasca 软件都建立在每个程序基础的共同元素层之上——无论程序使用何种数值方法或元素。因此&#xff0c;无论是使用 DEM 软件&#xff08;如 3DEC 或 PFC&#xff09;&#xff0c;还是使用 FLAC3D 等连续体软件&#xff0c;都会有许多流程、实用程序和功能是所有这些软件…

C++奇迹之旅:隐含的this指针

文章目录 &#x1f4dd;this指针&#x1f320; this指针的引出&#x1f309; this指针的特性&#x1f309;this指针存在哪里 &#x1f320;思考&#x1f320;C语言和C实现Stack的对比&#x1f309; C语言实现&#x1f309; C实现 &#x1f6a9;总结 &#x1f4dd;this指针 在C…

Redis入门到通关之Set实现点赞功能

文章目录 set 数据类型介绍不排序实现排序实现 set 数据类型介绍 Redis中的set类型是一组无序的字符串值。 set通过其独特的数据结构和丰富的命令提供了在存储和处理集合元素方面的一些非常有用的功能。下面列出了主要的set类型命令&#xff1a; SADD key member1 [member2]&a…

第十五届蓝桥杯 javaB组第三题

测试通过了90% 剩下10%不知道哪错了 思路&#xff1a;我想的是用map&#xff0c;k存第几个队列&#xff0c;value存每个子队列的长度&#xff0c;最后给value排序 第一个就最小的也就是是有效元素数量 考试只对了个案例&#xff0c;其它情况没测试。 复盘 回来后经过修改改…

openwrt局域网配置多个IP

在局域网配置过程中&#xff0c;若是DHCP服务器关闭&#xff0c;又忘记了配置的ip&#xff0c;将很难访问到路由器重新进行配置。这种情况可以在路由器出厂时做一个备用ip去避免。 1.配置 以下是备用ip的配置方法&#xff0c;以SKYLAB的SKW99 WIFI模组为例进行说明&#xff1…

如何应对MySQL单表数据量过大:垂直分表与水平分表策略解析

话接上回&#xff0c;单表最大数据建议两千万&#xff0c;那如果开发一个项目&#xff0c;预计注册量达到一个亿怎么办。 单表内放这么多数据&#xff0c;MYSQL底层B树的层级结构就可能会变得很高&#xff0c;磁盘io次数变多&#xff0c;性能会大幅度降低。所以考虑数据库分表…

设计模式-模板方法模式(TemplateMethod)

1. 概念 模板方法模式是一种行为设计模式&#xff0c;它在一个方法中定义算法的骨架&#xff0c;将一些步骤延迟到子类中实现。 2. 原理结构图 2.1 图 2.2 角色 抽象类&#xff08;Abstract Class&#xff09; 定义抽象的基本操作&#xff08;Primitive Operations&#xff…

Java+saas模式 智慧校园系统源码MySQL5.7+ elmentui前后端分离架构 让校园管理更高效的数字化平台系统源码

Javasaas模式 智慧校园系统源码MySQL5.7 elmentui前后端分离架构 让校园管理更高效的数字化平台系统源码 智慧校园是在数字通增强版基础上&#xff0c;研发的一套面向教育行业的数字化校园软件&#xff0c;其显著特点是集学校网站、协同办公、即时通讯、网络空间、移动办公于一…

接口自动化测试之调用excel实现接口数据依赖

背景 我们把接口的信息按照规定的格式都维护在excel文件中&#xff0c;通过代码实现调用excel&#xff0c;完成接口的自动化测试。这样&#xff0c;只需要负责人将主要逻辑写好之后&#xff0c;公司其他不会写代码的员工&#xff0c;也可以通过维护excel中的接口数据&#xff…

C语言 递归

递归指的是在函数的定义中使用函数自身的方法。 举个例子&#xff1a; 从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚&#xff0c;正在给小和尚讲故事呢&#xff01;故事是什么呢&#xff1f;“从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚&…

【算法练习】29:插入排序学习笔记

一、插入排序的算法思想 原理&#xff1a;将一个无序的数据序列逐步转化为有序序列。算法将待排序的数组分为两个部分已排序部分和未排序部分。 时间复杂度&#xff1a;插入排序的时间复杂度在最坏、平均和最好情况下的表现相同&#xff0c;均为 &#xff0c;其中 n 是待排序数…