面向对象高级部分集中在一些特殊的方法和属性,看起来跟其他语言有非常大的不同
名称的返回值一般都是字符串
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一样,进行集合运算, |代表并集运算 **
两个实例能不能加加减减