工作中,我们使用一些之前没用到过的模块,使用时需要了解一下这个模块中的一些类的方法或属性,怎么做呢?目前我比较常用的两款IDE“Pycharm”和“VSCode”,都可以通过先导包,然后通过“Ctrl+鼠标左键”,进入源码后观看并膜拜一下大神们的代码,当然也可以进入我们在项目中自己所定义的,然后进行快速修改,真的是很方便呢。但是有的时候,我们使用的环境没有这类的IDE,那该怎么学习我们要用的这些类方法和属性呢?方法当然很多,无论是小白,还是大神,百度谷歌大法都是比较快速和方便的。但是对于一些刚开源的或者是我们自己定义的呢,这里我们就聊聊Python 中的内建函数——dir 函数

首先可以先通过简单的源码解读,可以得知:

1.他的返回值是一个元素为字符串的列表

2.当传入一个模块对象时,返回的是模块里面所有的属性(变量名和方法)

我在function_use 这个文件夹或者包中创建了一个模块(demo01.py),内容随便定义几个变量和函数及类,如:

1 a = 10

2 b = 'test'

3

4 defc(x):5 print(x)6

7 classD(object):8 def __init__(self):9 self.name = 'name'

10 self.age = 18

11

12 defget_name(self):13 returnself.name14

15 classE(D):16 pass

然后再创建一个模块(demo02.py),并在"demo02.py"中引用"demo01.py“,然后打印dir(demo01),如:

1 from function_use importdemo012

3 print(dir(demo01))4

5

6 ['D', 'E', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'b', 'c']

3.当传入的对象是一个类时,返回这个类及其所有父类(包括父类的父类)的属性和方法

就上面的例子,无论是在当前模块“demo01.py”下面调用:

1 ...2 if __name__ == '__main__':3 print(dir(D))4

5 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_name']

还是在“demo02.py” 中引用的调用

1 from function_use importdemo012

3 #print(dir(demo01))

4 print(dir(demo01.D))5

6 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_name']

可以看出,结果是一样的。

4.当传入的对象是其他的时候(照我的理解,这个其他对象,就是一个实例对象),则返回这个实例对象的属性和方法,实例对象类的属性和方法,以及这个类的所有基类的属性和方法

相对于第三种情况(传入的对象是一个类时)其实只是多了这个实例对象的属性,感觉绕的话,就看下面的例子:

老样子,在”demo01.py“ 里面

1 ...2 if __name__ == '__main__':3 e =E()4 print(dir(e))5

6 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'get_name', 'name']

或者在”demo02.py“ 里面

1 from function_use importdemo012

3 #print(dir(demo01))

4 e =demo01.E()5 print(dir(e))6

7 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'get_name', 'name']

可以看到,只是多了E 的实例对象的两个属性“age” 和“name”

===================问题分割线===================

这里就有一个待解决的问题,就上面的例子,我尝试了在demo01.py 模块的D 这个类里面加了一个类方法及类属性

1 a = 10

2 b = 'test'

3

4

5 defc(x):6 print(x)7

8

9 classD(object):10 dd = 123

11

12 def __init__(self):13 self.name = 'name'

14 self.age = 18

15

16 defget_name(self):17 returnself.name18

19 @classmethod20 defprint_x(cls):21 print("x")22

23

24 classE(D):25 pass

26

27

28 if __name__ == '__main__':29 #e = E()

30 #print(dir(e))

31 print(dir(E))32 E.print_x()33 #print(E.get_name())

34

35

36 ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'dd', 'get_name', 'print_x']37

38 x #E.print_x()

View Code

这都没问题,但是我去调用dir 函数返回的“get_name” 函数时,却提示我必须要传入一个必传的参数“self”这样就需要

print(E.get_name(E()))了,但是这样的话,为什么这个方法可以出现在dir(E)的返回值里面呢?

有点晕

===================问题分割线===================

说完这个函数的返回值,我们再聊聊其中具体的内容,这里用自定义的例子不好说明,就搬来廖老师的例子吧

首先对一个字符串对象,比如“ABC” 使用dir()函数,查看他的所有属性和方法

1 print(dir("ABC"))2

3 ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__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', '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']

可以看出来,字符串对象的属性和方法还是很多的,类似__xx__的属性和方法在Python 中都是有特殊用途的,比如__len__方法返回长度。在Python 中,如果你调用len() 函数试图获得一个对象的长度,实际上,在len() 函数内部,它自动去调用该对象的__len__() 方法,所以得到两个结论:

1.下面的代码是等价的

1 print(len("ABC")) #3

2 print("ABC".__len__()) #3

2.对一个对象使用dir 函数,返回的列表里面,如果没有__len__ 方法,我们去对这个对象使用len 函数,就会报TypeError 的错

比如对整数类型使用len 函数,或者是上面我们"demo01.py" 里面的"e" 使用len 函数,如果我们想用len(e) 的话,就要自己写一个__len__() 方法:

1 classD(object):2 dd = 123

3

4 def __init__(self):5 self.name = 'name'

6 self.age = 18

7

8 def __len__(self):9 return 100

10

11 defget_name(self):12 returnself.name13

14 @classmethod15 defprint_x(cls):16 print("x")17

18

19 classE(D):20 pass

21

22 if __name__ == '__main__':23 e =E()24 print(len(e)) #100

除了这些“__xx__” 特殊格式的方法,剩下的都是普通属性或方法,比如lower() 返回小写的字符串

1 print("ABC".lower()) #'abc'

未完

python查看类的属性和方法_Python 获取对象的属性和方法—dir 函数相关推荐

  1. python查看类的属性和方法_python—类的属性和方法总结

    一.类的属性总结(类的属性定义在方法外,对象的属性定义在方法内) 理解: 类的(静态)属性:(人类的五官,理解为变量) 类的(动态)方法:(人类吃穿住行,理解为一个函数,至少带一个参数self,指向类 ...

  2. python 之属性_Python之对象的属性

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之对象的属性 #http://python.jobbole.com/82622/ #对象的属性 ...

  3. python中字符串转xml对象_Python实现对象转换为xml的方法示例

    本文实例讲述了Python实现对象转换为xml的方法.分享给大家供大家参考,具体如下: # -*- coding:UTF-8 -*- ''''' Created on 2010-4-20 @autho ...

  4. python访问属性的格式_Python 中几种属性访问的区别

    图 | <借东西的小人阿莉埃蒂>剧照 起步 python的提供一系列和属性访问有关的特殊方法:__get__, __getattr__, __getattribute__, __getit ...

  5. 可以获取python中输出函数帮助的是_Python帮助函数调试函数 用于获取对象的属性及属性值...

    Python帮助函数调试函数 用于获取对象的属性及属性值 刚接触Python,上篇 <Python入门>第一个Python Web程序--简单的Web服务器 中调试非常不方便,不知道对象详 ...

  6. python的函数的对象属性_Python帮助函数调试函数 用于获取对象的属性及属性值...

    Python帮助函数调试函数 用于获取对象的属性及属性值 刚接触Python,上篇 <Python入门>第一个Python Web程序--简单的Web服务器 中调试非常不方便,不知道对象详 ...

  7. 获取对象的接口信息(方法/属性/事件)(VB6代码)

    要不是WS的超级绿豆提起这东西,我还不知道呢.... 真是个好玩意!!能列出一个对象的接口,包括方法,属性,事件.....微软直接做了啊. 记录一下,以后要用到时免得忘了: Option Explic ...

  8. 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】...

    方法1:通过get()方法获取属性值 package com.sxd.test.controller;public class FirstCa{private Integer num;private ...

  9. java获取object属性值_java反射获取一个object属性值代码解析

    有些时候你明明知道这个object里面是什么,但是因为种种原因,你不能将它转化成一个对象,只是想单纯地提取出这个object里的一些东西,这个时候就需要用反射了. 假如你这个类是这样的: privat ...

最新文章

  1. java 0000 0001 0002 000a 000b_同样的 Java 文件,为什么直接用 Javac 编译和使用 Maven 编译出来所得到的字节码不一样?...
  2. 【JUC并发编程05】集合的线程安全
  3. 工具推荐|程序员必须知道的11款新型编程工具
  4. 高等数学回顾.pptx
  5. 数据库查询某一列大写转化小写字母表示_基于MySQL数据库下亿级数据的分库分表...
  6. MyBatis的高级映射之多对一
  7. Python中乐高积木——函数
  8. JavaFX官方教程(十五)之A Xylophone.java
  9. python身份证号掩盖出生日期的代码_利用Python制作全国身份证号验证及查询系统!就问你吊不吊!...
  10. excel中画图坐标轴更改数字大小_Excel柱状图看不清?用这3种方法就可以
  11. 计算机应用技术知识,计算机应用技术主要学什么
  12. django 创建项目
  13. Servlet 2.4 规范之第四篇:Servlet上下文
  14. const,readonly字段的取舍!
  15. 从实例中学习grid布局
  16. Sublime 快捷键整理
  17. 裸辞后,随便找份工作干着还是等找到满意的为止?
  18. 180417 马克飞象使用帮助
  19. 机器学习 识别图片人物动作_一键学习人物识别说明
  20. 《Gradient-based learning applied to document recognition》翻译

热门文章

  1. MySQL中如何通过修改表实现约束的添加与删除
  2. Spring boot格式化器
  3. JMSTemplate发送消息
  4. spring 事务隔离级别和传播行为_Spring事务传播实战
  5. 【xmind】 使用 Java 生成思维导图
  6. 线上问题分析系列:数据库连接池内存泄漏问题的分析和解决方案
  7. 信息系统项目管理知识--软件工程
  8. oracle 错误: ORA-12899:始终提示字段太大
  9. 解决 Oralce 执行set autotrace on时的SP2-0618和SP2-0611错误
  10. [转]opensuse vim 的语法高亮