2019/11/17 01-dir的作用

面向对象高级部分集中在一些特殊的方法和属性,看起来跟其他语言有非常大的不同在这里插入图片描述
名称的返回值一般都是字符串
module,某个类或者函数,定义在某个模块里了

比如这样就定义了函数和类,都有module,__main这样就代表主模块,就是右键运行的模块
在这里插入图片描述
把t作为一个模块导入,这个就是当前模块名,如果是当前运行的模块就是main,如果是导入模块的就是导入模块的名字,模块名就是文件名 在这里插入图片描述
这样根本访问不到在这里插入图片描述
c返回b的调用,虽然是内部的,但是定义在当前模块里
在这里插入图片描述
在其他模块运行也一样在这里插入图片描述模块已经返回了一个string对象,string对象没有name,但是函数对象和类对象是有名字的,往往name返回的就是字符串
在这里插入图片描述在这里插入图片描述
返回基类的元组
在这里插入图片描述
c返回的是直接父类
在这里插入图片描述
直接的父类
在这里插入图片描述
所有的祖先类用mro,主要是方法解析的顺序,把继承路径线性化了
在这里插入图片描述
文档,在类定义和函数定义的第一行在这里插入图片描述
** __mro__属性和mro方法返回结果是一致的,一个返回列表,一个返回元组而已**在这里插入图片描述
类有类的,实例有实例的dict,是个只读字典,不允许操作的

在这里插入图片描述
在这里插入图片描述
** 双下划綫叫dunder**在这里插入图片描述
**会返回对象,或者对象的所有成员列表,dir是内建函数,就是调用这个方法的__dir
(),如果__dir__()这个方法,则返回属性的列表,否则会尽量从__dict__属性中收集信息
但是对象属性不一定都在dict中,还有可能在其他地方**

现在类的字典有两个key

在这里插入图片描述
查看下dir©能打印什么
在这里插入图片描述
doc和module都在里面,dir返回的是一个列表,属性的key,通过这个key我们就可以拿到值,这个内建函数,尽量会抽取对象的所有的属性,这些都是从object上来的,现在python中一切类型都是继承自object,object已经定义了一些属性,就继承下来 了在这里插入图片描述
dir可以把字典当中key拿来,还会收集一些跟你当前对象自己的属性也会收集,也会把你继承下来的属性也会收集起来

前面是收集类的,试一下方法,定义这个dir方法,这样相当于return none
说明原来定义不定义都会有个dir的
在这里插入图片描述
但是看到这个self,说明影响的是实例的,但是当前没什么实例,所以没什么变化在这里插入图片描述

现在看一下实例化的c
c实例尽量去收集属性,有一些属性从它的父类里面收集来,所有有一大堆属性在

在这里插入图片描述
定义一个self.x=100在这里插入图片描述
看看是否能收集到这个实例的x属性,这个属性刚好装在实例字典当中
在这里插入图片描述
没有返回一个可迭代对象
在这里插入图片描述在这里插入图片描述
这个是实例方法,对类的收集不做任何影响,如果要一个实例来dir收集,恰好你又定义好了dir,就优先使用你定义的,在这里插入图片描述
如果没有定义,就尽可能收集所有属性,从父类继承的,包括自己定义的实例属性
在这里插入图片描述
set(‘a’,‘b’,‘c’)返回一个abc的集合
在这里插入图片描述
生成器对象也可以(要对你这个可迭代对象一项项迭代,然后把里面东西拿出来,认为是收到的属性)
在这里插入图片描述
这不是return a,而是return一个可迭代对象,只有一个元素,一包装,一定会返回一个列表类型,这样就返回[‘a’]
在这里插入图片描述
说明收集的是当前环境里的东西,当前运行模块里的在这里插入图片描述
所以这里什么都不写,是收集了当前模块里的东西
在这里插入图片描述

现在看看到底打印的全部 作用域的东西,还是局部作用域的东西在这里插入图片描述
所以不能说是dir收集当前模块信息的,在局部作用域是不是还是当前的结果

在里面在写一个函数试试
在这里插入图片描述
可以在局部环境看见这些属性,只不过这些属性是局部变量
在这里插入图片描述
现在如果右键直接运行t3会如何在这里插入图片描述在这里插入图片描述
与这里有了一些变化,主模块导入是会有一些变化
在这里插入图片描述
定义什么类就还是有什么类,该存在还是存在

因为abc在之前没有定义,所以把打印的往后

在这里插入图片描述
这个dir其实是里面有self,是实例的,会尽量去收集这个实例相关的所有属性,包括从父类继承的属性都会收集过来,比如__name__,class
里面**
如果实例obj没有提供这个__dir__()方法,就尽可能 收集这个实例本身类的信息,因为类不受影响
在这里插入图片描述
现在能不能这么写,对t这个模块收集信息在这里插入图片描述
上面导入的时候回加载这个模块,会把放在模块里顶级的代码运行一遍在这里插入图片描述
不带参的dir(),是收集当前作用域内的属性和方法在这里插入图片描述
如果指定模块,dir(t),就会收集指定模块的看到的标识符和属性
在这里插入图片描述
如果实例没有dir方法,将最大限度地收集参数信息在这里插入图片描述
dir对于不同类型的对象具有不同的行为:
如果对象是模块对象,返回的列表包含模块的属性名。
如果对象是类型或者类对象,返回的列表包含类的属性名,及它的基类的属性名(把继承的都拿过来)
否则,返回列表包含对象的属性名,它的类的属性名和类的基类的属性名

在这里插入图片描述
dir()是收集当前作用域内的
import导入的时候回把这个模块重新加载一次

在这里插入图片描述在这里插入图片描述在这里插入图片描述
dir()是收集当前作用域里的所有标识符,所以会有这个t在这里插入图片描述
导入的c就也在,能用从的原因就是,c的标识符如果不在这里,你是不能使用的
在这里插入图片描述
相当于收集animal模块里提供的信息
在这里插入图片描述
类上的东西都在这了
在这里插入图片描述在这里插入图片描述
实例的测试一下在这里插入图片描述在这里插入图片描述
这是一个实例的在这里插入图片描述
注释掉应该会收集所有信息在这里插入图片描述
这两个是一样的在这里插入图片描述、基本上是对齐的,说明是从父类上得到的在这里插入图片描述
key是可以用list set,value不行,如果value不重复的,这个item也是一个set在这里插入图片描述
把前面的去掉就没有printdir了
在这里插入图片描述
x是实例的字典
dir不仅是把继承下面的得到了,还把一些类和实例本身的特别属性也会加到里面去

在这里插入图片描述
如果不定义dir的实例方法,相当于把基类的所有属性,类的所有属性,整个祖先类的属性,加上自己的,能收集的全部收集
在这里插入图片描述在这里插入图片描述
**类set集合可以当set一样,进行集合运算, |代表并集运算 **在这里插入图片描述在这里插入图片描述在这里插入图片描述
两个实例能不能加加减减
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值