一、私有属性和私有方法
1.使用场景
对象的某些方法和属性,只希望对象内部使用,外部和子类都不能访问
2.定义方法
在属性名或方法名前 增加 两个下划线 __
self.__age = age #私有属性
def __getAge(self): #私有方法
pass
在python中没有真正的私有
解释器对私有属性或方法的处理方式:在名称前加上 _类名 => _类名__名称
print("访问私有属性:%d" % xiaomei._Women__age)
xiaomei._Women__secret2()
子类对象
子类对象方法中,不能访问父类的私有属性或方法
可以通过 父类 的公有方法 间接访问私有属性或方法
3.eg
1 | class Women: |
二、面向对象 - 继承
实现代码的复用,提高效率
1.单继承
子类拥有父类的所有方法和属性
可重写父类方法
覆盖父类的方法;
对父类的方法进行扩展;
super().父类方法; # 在需要的位置执行父类方法
#python2.x 可以采用 父类名.方法(self) -- 不推荐
传递性(子类可继承父类,可继承父类的父类)
语法:
class 类名(父类名) :
pass
2.eg:
1 | class Animal: |
3.多继承
子类 可以拥有多个父类,具有所有父类的属性和方法
语法格式:
class 子类名(父类名1,父类名2,...):
pass
注意事项:
如果父类之间 存在 同名的属性或方法, 应 避免 使用多继承
MRO(method resolution order) 主要用于在多继承时判断方法、属性的路径调用顺序
eg:C(B,A)
在执行C对象方法时: C类中查找 --无—->B类中查找 --无—->A类中查找 --无—->object类(基类)中查找 --无—->程序报错
兼容性问题(python2.x和python3.x)
在定义类时,没有父类时,建议统一使用继承object类
class A(object):
pass
在python3.x中没有使用object基类,会默认使用基类
1 | class A(object): |
三、面向对象 - 多态
1.概述
定义:不同的子类对象调用相同的父类方法,产生不同的执行结果;
作用:增加代码的灵活度;
使用前提:继承、重写父类方法;
2.eg
1 |
|
四、类
类的实例:创建出来的对象
实例化:创建对象的动作
实例属性:对象的属性
实例方法:对象的方法
类是一个特殊的对象,类对象在内存中只有一份
每个对象都有自己独立的内存空间,保存各自不同的属性
多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法内部
1.类属性
给类对象中定义属性,用来记录与这个类相关的特征,不会用于记录具体对象的特征
属性获取 存在一个向上查找机制
1 | class Tool(object): |
2.类方法
针对类对象 定义的方法
语法格式:
@classmethod
def 类方法名(cls):
pass
类方法需要使用修饰器@classmethod ;
类方法的第一个参数应该是cls
通过 类名.调用类方法,不需要传递cls参数
在方法内部:
通过cls. 访问类的属性
通过cls.调用其他的类方法
1 | class Tool(object): |
3.静态方法
既不需要 访问实例属性或实例方法
也不需要 访问类属性或类方法
语法格式:
@staticmethod
def 静态方法():
pass
调用方式:
类名.静态方法
1 | class Tool(object): |
4.类方法类属性案例
1 | class Game(object): |
五、单例
设计模式:针对某一特定问题的成熟的解决方案
单例设计模式:
让类创建的对象,在系统中只有唯一的一个实例;
每一次执行 类名() 返回的对象,内存地址是相同的;
1.new方法
__new__是一个由object 基类提供的内置静态方法,作用:
在内存中为对象分配空间
返回对象的引用
使用 类名() 创建对象时,
python解释器首先会调用__new__方法为对象分配空间
python解释器获得对象引用后,将引用作为第一个参数传递给 __init__方法(初始化方法)
重写__new__方法:
return super().__new__(cls) #必须返回,否则解释器得不到分配了空间的对象引用,不会调用__init__初始化方法
2.eg
1 | class MusicPlayer(object): |
参考资料:
1.黑马视频
2.W3C-Python