python复习概念_oop高

一、私有化属性
私有化属性语法:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问

使用私有属性的场景
1.把特定的一个属性隐藏起来,不想让类的外部进行直接调用
2.我想保护这个属性,不想让属性的值随意的改变
3.保护这个属性,不想让派生类【子类】去继承

私有化属性小结:
1.私有化的【实例】属性,不能在外部直接的访问,可以在类的内部随意的使用
2.子类不能继承父类的私有化属性【只能继承父类公共的属性和行为】
3.在属性名的前面直接加'__',就可以变为私有化了

私有化方法特性:一般是类内部调用,子类不能继承,外部不能调用

二、property
要想更加简单的得到、修改私有属性,可以使用类似Java的getter和setter方法
用到property函数,通过装饰器的方式更加简单
exa:
class People:
  def __init__(self):
  self.__age = 18 # 定义一个私有化属性,属性名字前加__
@property # 用装饰器修饰 添加属性标志 提供一个getter方法
def age(self): # 访问私有实例属性
  return self.__age
@age.setter # 提供一个setter方法
def age(self,age): # 修改私有实例属性
  self.__age = age

三、魔术方法__new__
__new__方法的作用:创建并返回一个实例对象,如果__new__只调用了一次,
就会得到一个对象。继承自object的新式类才有new这一魔法方法。

注意事项:
1.__new__是在一个对象实例化的时候所调用的第一个方法
2.__new__至少必须要有一个参数cls,代表要实例化的类,此参数在实例化时由python
解释器自动提供,其他的参数是用来直接传递给__init__方法
3.__new__决定是否要使用该__init__方法,因为__new__可以调用其他类的构造方法
或者直接返回别的实例对象来作为本类的实例,如果__new__没有返回实例对象,
则__init__不会被调用
4.在__new__方法中,不能调用自己的__new__方法,即:return cls.__new__(cls),
否则会报错(RecursionError:maximum recursion depth exceeded:超过最大递归深度)

对__new__理解:
# 在新式类中 __new__ 才是真正的实例化方法,为类提供外壳制造出实例框架,然后调用该框架内的构造方法__init__进行丰满操作
# 比喻建房子 __new__ 方法负责开发地皮 打地基,并将原料存放在工地,而__init__负责从工地取材料建造出地皮开发图纸规定的大楼
# 负责细节设计、建造,最终完成

四、单例模式
单例模式:是一种常用的软件设计模式 目的:确保某一个类只有一个实例存在
如果希望在某个系统中,某个类只能出现一个实例的时候,那么这个单例对象就满足要求

五、异常
语法:
try:
  可能出现错误的代码块
except:
  出错之后执行的代码块
else:
  没有出错的代码块
finally:
  不管有没有错都执行的代码块

异常的抛出机制
如果在运行时发生异常,解释器会查找相应的异常捕获类型
如果在当前函数里面没有找到的话,它会将异常传递给上层的调用函数,看是否处理
如果在最外层没有找到的话,解释器就会退出程序,down掉

六、动态的绑定属性和方法
动态语言:运行时可以改变其结构的语言。例如新的函数、对象、甚至代码可以被引进,
已有的函数可以被删除或是其他结构上的变化。如php,JavaScript,python都是动态语言,
C,C#,java是静态语言。

动态添加实例方法
动态添加实例方法需要使用types
import types # 添加方法的库
xh.printInfo = types.MethodType(dymicMethod,xh) # 动态的绑定方法
对象 新的方法名 要添加的方法,对象
xh.printInfo() # 调用动态绑定的方法

给类绑定类方法和静态方法
使用方式:类名.方法名 = xxxx
#给Student类绑定类方法或静态方法
Student.classMethod = classMethod
Student.classMethod()

七、__slots__方法
__slots__属性: python是动态语言,在运行的时候可以动态添加属性。
如果要限制在运行的时候给类添加属性,Python允许在定义class的时候,
定义一个特殊的__slots__变量,来限制该class实例能添加的属性。

用法: 只有在__slots__变量中的属性才能被添加,没有在__slots__变量中的属性
会添加失败。可以防止其他人在调用类的时候胡乱添加属性或方法。
__slots__属性子类不会继承,只有在当前类中有效

作用:
1.限制要添加的实例属性
2.节约内存空间

在继承关系当中的使用 __slots__:
1.子类未声明__slots__时,那么是不会继承父类的__slots__,
此时子类是可以随意的给属性赋值的
2.子类声明了__slots__时,继承父类的__slots__,也就是子类__slots__的范围为:
其自身+父类的__slots__

上一篇:Sping 梳理9--AOP简介


下一篇:Day 21 OOP