1 ,首先谈下面向对象的应用场景
在平时敲代码开发程序过程中,往往会遇到一些比如设计一套系统,功能比较多,代码量又很庞大的,并且,要实现的需求中还要处理很复杂的各种角色或者功能的关系时,就要考虑用面象对象的编程方法去开发你的系统或者软件,比如:腾讯的QQ,各大一线电商平台,还有公司和学校,医院用的金融业用的一些CRM系统或者实现数据采集,汇总的一些办公软件等等
面向对象的编程思想相对目前的IT行业,是一个应用很成熟的编程思想,所以这是一个需要重点掌握的知识
2,谈下面向对象编程在工作中带来好处:
任何一家科技公司或者开发部门,或着外包的团队,都是协同开发,团队开发的.所以功能的实现,往往是要分开设计开发,这时对程序员的对代码的逻辑性,可读性,还有简洁性都是有要求的
这就要谈一谈面向对象开发的好处了,(1) 增加了代码的可读性,方便他人阅读(2):增加了代码的可扩展性,(3)增加了代码的可扩展性(4):增加了代码的复用性,(5)代码更加规范
3, 面向对象 这会对象在Python中有个经典说法 python当中一切皆对象
我的理解:
类: 类和类型在python3中是一个概念,都是类,,
type(类)的结果就是创建这个类的元类,大多数情况下就是type,除非你指定metaclass
type默认是所有类的元类,object是所有类的父 类
对象:__new__()创造了一个对象的空间,__init__一些简单的初始化封装属性 注意:对象的名称空间内存的只有属性,没有方法,
4:组合:(构思逻辑:什么有什么的关系) 一个对象作为另一个对象的属性
5:继承:(构思逻辑:什么是什么的关系) 包括单继承和多继承 java只支持单继承
单继承:子类对象调用某个方法.(1)子类有就调用子类的. (2)子类没有就找父类的
子类有想调用父类的一是super(子类名,self).方法名(除了sel之外的参数)
二是父类名.方法名(self,....)
注意::在任何类中调用的方法,都要仔细分辨一下这个self到底是谁的对象
多继承: 新式类: 广度优先--- c3算法 mroa方法查看继承顺序
python3默认继承object ,所以py3都是新式类 super().func() 遵循mro算法,在类的内部不用传子类名和self
经典类: 深度优先,遵循一条路走到黑
py2 不继承object,默认都是经典类 py2 需要主动继承object super(子类名,self).func() 必须传子类名和self
6: 抽象类 和接口类
(1)不能被实例化 (2) 规范子类当中必须实现的某个方法 (3)有原生的实现抽象类的方法,但是没有原生实现接口的方法
抽象类 : 抽象类中的方法是可以实现的 只能单继承
接口类 : 可以多继承 但是这个类中的所有方法都不应该实现
java: java 只支持类的单继承 抽象类 父类的方法可以实现
接口 interface 支持多继承的规范 接口中的所有方法 只能写pass
7:多态 在python当中处处存在 一种类型的多种形态,多个子类去继承父类,那么每一个子类都是这个父类的一种形态
鸭子类型: 你看着像鸭子,那么它就是鸭子 总之,规范全屏自觉
8:@property 装饰器函数 内置函数 帮助你将类中的方法伪装成属性,也叫特性
调用方法的时候不需要主动加括号
让程序的逻辑性更合理
@方法名.setter 装饰器,修改被property装饰的属性的时候会调用被这个装饰器装饰的方法,除了self之外还有一个参数,被修改的值
@方法名.deleter 装饰器,当要删除被property装饰的属性的时候会调用被这个装饰器装饰的方法
9,@classmethod 类方法的装饰器 内置函数 使用类名调用,默认传类名作为第一个参数,不用对象命名空间中的内容,而用到了类命名空间中的变量(静态属性),或者类方法或静态方法
@staticmethod 静态方法装饰器,内置函数,说白了就是一个普通函数的方法定义到需要子类调用的抽象类中,不需要传值,就能定义成静态方法 比如:登录的功能函数
10: 内置方法和魔法糖
__str__ :要求必须实现了__str__,要求这个方法的返回值必须是字符串str类型,#print %s str
__call__: 对象()
__len__:要求obj必须实现了__len__,要求这个方法的返回值必须是数字int类型
__new__:在实例化的过程中,最先执行的方法,在执行init之前,用来创造一个对象,构造方法(创造一个空间)
a.__add__(b) : 执行加法运算 ===> 同理 __sub__ 执行减法运算 __mul__ 执行乘法运算 __div__ 执行除法运算
__repr__: 是__str__的备胎,如果有__str__方法,,那么# print %s str都先去执行__str__方法 , 并且使用__str__的返回值
如果没有__str__,那么 print %s str都会执行repr,,repr(obj),%r
__del__ 析构方法(释放一个内存空间) del 对象名 会自动触发这个方法或者Python会,一段时间会检测垃圾,触发垃圾回收机制
不管是主动还是被动,这个f对象总会被清理掉,被清理掉就触发__del__方法,就会归还操作系统的文件资源
item系列: 类中有一些特殊的方法,要求对象使用 [] 访问,就能触发 __getitem__() __setitem__() __delitem__()
我的理解,多维度的数据类型zhiy只要用括号就能触发(列表,字典,元组)
class B:
def __getitem__(self,name):
return getattr(self,name)
def __setitem__(self, key, value):
return setattr(self,key,value)
def __delitem__(self, key):
delattr(self,key)
b = B()
b.k2 = 'v2' #添加了一个对象属性
# print(b.k2)
b['k1'] = 'v1' # __setitem__ 新增属性
# print(b['k1']) # __getitem__ 查询单一属性
# print(b.__dict__) # 查看全部属性
del b['k1'] # __delitem__ 删除属性
print(b['k1'])
hash方法====>底层数据结构基于hash值寻址的优化操作 运行一次程序,涉及到hash值,那么这个值,全程不会变
再次运行程序,那么这个hash值相比较上次运行是变了的,但是本次程序全程不会变
hash(obj) #obj内部必须实现了__hash__方法 带有hash算法的数据类型,效率值高
集合的去重内部机制:先调用hash,再调用eq,eq不是每次都触发,只有hash值相等的时候才会触发
__eq__(self,other) 判断两个对象的值是否相等 == 用这个命令就能触发
重点: 这些内置的命令,会在你的类中有时会用到,需要重点记忆,编写某些模块或者功能时会用到