面向对象
一面向对象
- 什么是面向对象:
一种认识世界、分析世界的方法论。将万事万物抽象为类。 - 类class:
类是抽象的概念,是万事万物的抽象,是一类事物的共同集合的集合。
用计算机语言来描述类,就是属性和方法的集合。 - 对象instance,object:
对象是类的具象,是一个实体。
每个个体都是抽象类的不同实体。 - 哲学
一切皆对象
对象是数据和操作的封装
对象是独立的,但是对象之间可以相互作用
目前OOP(面向对象编程)是最接近人类认知的编程范式 - 面向对象三要素
- 封装
组装:将数据和操作封装在一起
隐藏数据:对外只保留一些接口通过接口访问对象 - 继承
多复用,继承来的就不用自己写了
多继承少修改,OCP(Open-closed Princeple),使用继承来改变,来体现个性 - 面向对象变成最灵活的地方,动态绑定
- 封装
6.实例化
实例变量是每一个实例自己的变量,是自己独有的;类变量是类的变量,是类的所有实例共享的属性和方法
总结
类变量所有实例共享,实例自己的类无法访问
实例可以动态增加属性。实例,__dict__[变量名]或实例, [变量名]访问
实例属性查找顺序,自己的__dict__,如果没有就通过__class__找到自己的类然后去类的__dict__
7.装饰一个类
8.猴子补丁(Monke Patch)
在运行时,对属性、方法、函数等进行动态替换。
其目的是为了通过替换、修改来增强、扩展原代码的能力。
黑魔法,慎用。
9.属性装饰器
好的设计是:把实例属性保护起来,不让外部直接访问,外部使用getter和setter读取和修改属性。
特别注意:使用property装饰器的时候三个方法同名
10方法重载
python没有重载或者说python本身就实现了其他语言的重载。
11封装
将数据和操作组织到类中,即属性和方法
将数据隐藏起来,给使用者提供操作(方法)。使用者通过操作就可以获取或者修改数据。
getter和setter
通过访问控制,暴露适当的数据和操作给用户。该隐藏的隐藏起来,例如保护成员和私有成员。
二,类的继承
继承
继承是让子类从父类获取特征(属性和方法)
父类:又称基类或超类
子类:也成派生类
总结:
继承时,共有的,子类和实例都可以随意访问;私有成员被隐藏,子类和实例不能直接访问,私有变量所在的类内的方法可以直接访问这个私有变量。
Python通过自己的一套实现,实现了和其他语言一样的面向对象的继承机制。
属性查找顺序
实例的__dict__ >类__dict__如果有继承 >父类__dict__、
如果都没有找到就会抛异常,否则先找到就立即返回。
1.方法的重写,覆盖override
如果类B声明继承自类A,则类B的__bases__中可以看到类A。
但是这和是否调用类A的构造方法是两回事。
如果B调用A的构造方法,就可以拥有父类的属性了。
注意:调用父类的init方法,出现在不同的位置,可能导致不同结果。
故调用时一般把调用父类的放在最前(使用super().__init__调用)
特别注意:
一个原则,自己的私有属性,就该自己的方法读取和修改,不要借助其他类的方法,即使是父类或派生类的方法(因为私有属性的改名极其容易弄混)
三,多继承
Python2为了兼容分为旧式类和新式类
Python3全是新式类
新式类继承自object,可以使用super。
多继承
OCP原则:多用“继承”、少修改。
继承的用途:增强基类、实现多态
多态
在面向对象中,父类、子类通过继承联系在一起,如果通过一套方法,就可以实现不同的表现,就是多态。
一个类继承自多个类就是多继承,它将具有多个类的特征。
多继承弊端
多继承的实现会使编译器设计的复杂度增加,现在很多语言舍弃了类的多继承。
多继承可能带来二义性。
解决方案:要解决二义性,深度优先或者广度优先。
Python的多继承实现
注意:应该尽量避免使用多继承。
- Mixin
Mixin类
Mixin本质就是多继承的实现。
Mixin体现的是一种组合的设计模式。
在面向对象的设计中,一个复杂的类,往往需要很多功能,而这些功能又来自不同的类,这就需要很多类组合在一起。
从设计角度来说,多组合,少继承。
Mixin类使用原则
Mixin类不应显示出现init的初始方法
通常不能独立工作,因为它是准备混入别的类中的部分功能
Mixin类的祖先类也应该是Mixin类
注意:使用时,Mixin类通常在类继承的第一个位置
Mixin类和装饰器使用看个人喜好。但是如果需要继承就要使用Minxin类的方式了。
魔术方法
特殊属性
查看属性
- 魔术方法分类:
- 创建、初始化和销毁
- hash
- bool
- 可视化
- 运算符重载
- 容器和大小
- 可调用对象
- 上下文管理
- 反射
- 描述器
- 其他杂项
hash相等只是hash冲突,不能说明两个对象相等。
一般来说提供hash方法是为了作为set或者dict的可以,所以去重还要同时提供eq方法。
运算符重载应用场景
往往是用面向对象实现的类,需要大量的运算,而运算符是这种运算在数学上最常见的表达方式。
提供运算符重载,比直接提供加法方法更适合该领域的使用者习惯。
python提供了
这个装饰器可能带来性能问题。所以不如自己实现。
实现方法很简单除了eq方法必须有之外,lt,gt有其一和le,ge有其一就能实现和装饰器一样的功能。
上下文管理
上下文管理的安全性:安全。
就算是退出了python解释器依旧能够执行exit函数说明上下文管理很安全。
- 上下文应用场景
- 增强功能:
在代码执行的前后增加代码,增强功能。类似装饰器的功能。 - 资源管理:
打开的资源需要关闭 - 权限验证:
在代码执行之前,做权限验证,在enter方法中处理。
- 增强功能:
反射
运行时,区别于编译时,指的是程序被加载到内存中执行的时候。
反射,reflectio,指的是运行时获取类型定义信息。
一个对象能在运行时,像照镜子一样,反射出他的类型信息。
简单说,在python中,能够通过一个对象,找出其type,、class、attri或method的能力,称为反射或者自省。
具有反射能力的函数有:type()、isinstance()、callable()、dir()、getattr()
1.python提供了内置的函数
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98476