几个面试题:
1.什么时候用面向对象?
处理比较复杂的多个角色之间的关系。
清晰度提高,可读性强:无论开发还是调用,都能明确分辨出每个角色拥有的方法和属性。
增强了代码的可扩展性。
通过继承,增加了复用性。
更加规范。
2.如何理解python中一切皆对象
所有的基础数据类型都是对象,
3.类型与类的关系
类和类型是同一个东西
4.创建一个类,创建一个对象
对象:类名(),实例化
双下new开一个空间,做初始化
类:类都是被type创建的
判断某个类的type,得到的结果还是typ。一个类型的类型就是类型。那么这个类的元类是type。
用了指定的mateclass的,mateclass就是元类。
元类都用来创建类的,一般都是type创建的
1类
class 类名()面试题,52分钟
类是什么时候加载的?
只要运行就执行,在私有属性位置的语句必然执行!但是类名.属性是不执行的,因为必须要所有类里的代码都加载完的时候才会有类名对应的类,才可以引用。
类里有:
静态属性/动态属性。这些的东西的地址都存在类中,对象中存着的是一个对类的引用,不是这个被引用对象的地址,是存着这个被引用对象地址的一个变量的地址。
2对象
在对象中,有类空间指针还有一些只属于对象的属性。
3组合
一个类的对象是另外一个类对象的属性
表示的是xx有xx的关系,“人”有“武器”。
4继承
表示的xx是xx的关系,“人类”是“动物类”
单继承和多继承
单继承:子类的对象调某个方法,如果子类有就调子类的,没有就父类们的,没有报错。子类有还想调父类的,用supper(),不用再传self的就行。
在任何类中调用的方法,都必须要分辨self是谁的方法。
多继承:继承顺序。新式类(3里默认继承obj,广度优先遵循C3算法,mro()可查看继承顺序)/经典类(2里,不继承,深度优先,无mro())
父类和子类:为什么要继承,减少代码重复,节省代码
经典类和新式类
5抽象类和接口类
规范:子类中必须实现同名的方法,且都不能被实例化
python里有原生实现抽象类的方法,没有接口类的。
抽象类和接口类的区别:被单继承的是抽象类,被多继承的是接口类
6多态和鸭子类型
7.封装,私有
8@property
装饰器函数且内置函数,帮助把类中的类中方法伪装成属性。
修改就调用@方法名.setter的代码
删除就调用@方法名.deleter的方法,原来的property还在。
8类方法和静态方法
classmethod
使用类名调用,默认传类名作为第一个参数
不用对象空间的内容,而是只用类的内容(静态属性)/静态方法和类方法这三个都可以,别的都不行.
Staticmethod
一个类既不用类,也不要对象的内容,等同于一个函数,就将这个方法变为一个静态方法
使用原因:1,完全想用面向对象编程,所有函数都必须写到类里
2,某个功能确实是某个类的方法,但是也确实没有用到和这个类相关的资源
比如登录是某一个对象的动作,应该放在这个类里,别的类的无法调用,一般是先写功能,发现确实不用的时候,回头加装饰器
9,反射
从某个指定的命名空间内,用字符串数据类型的变量名来获取变量的值
类名反射静态属性和类方法 静态方法
对象反射 对象属性 方法
模块反射:模块中的方法
自己模块中的:
原因:变量名是字符串的版本:从文件里读的时候/交互拿:input,网络传输
10.内置方法
__名字__都不是被直接调用的
可能会被简介调用
__str__ str(obj),obj的类必须有__str__要求函数的返回值必须是str
__repr__ 打印对象的时候,执行__repr__,像__str__...有后者就先后者,
无的话关于__str__的调用都去变成__repr__
对应的是repr(obj)和这两种%r用法
是__str__的备胎,被使用__str__的返回值
所以说,__retr__的功能强大,对应的调用方式多
继承相关:子类中使用__str__,先找子类,再找父类的,没有就子类的__repr__,还无则父类的__repr__,一直没有就object的__str__
__call__ 对象加括号 用类写装饰器必须用
__new__在实例化的过程中,最先制定的方法,在__init__之前用来创造一个对象
__Len__ len(obj),obj的类必须有__len__要求函数的返回值必须是int