面向对象(封装,继承,多态)
- 一个对象的 属性 可以是 另外一个类创建的对象
- 私有属性和私有方法:访问方法,在 名称 前面加上
_类名
=>_类名__名称
就可以访问了
继承(体现出多态)
对父类方法进行扩展:
- 在子类中重写父类方法,在需要的位置调用
super().父类方法
,然后实现其他需求
多继承:如果不同父类存在同名方法,子类会调用那个方法?
- python中存在MRO(method resolution order)----方法搜索顺序,即内置属性
__mro__
可以查看方法使用顺序
新式类与经典(旧式)类
- 新式类以object为基类的类,后者相反且不推荐使用
- 默认使用object类为基类(python2中不会)
- 在多继承中影响方法的搜素顺序
类属性和类方法
- 如果使用
对象.类属性 = 值
赋值语句,只会 给对象添加一个属性,而不会影响到 类属性的值 - 实例方法可以使用类名.类属性,如果方法内部要访问实例属性和类属性,使用实例方法
- 类方法需要用修饰器
@classmethod
来标识,且第一个参数为cls - 静态方法用
@staticamethod
来标识,实例属性和方法,类属性和方法都不调用。
单例
设计模式:前人工作的总结和提炼,针对某一特定问题的成熟解决方案,使用设计模式为了可重用代码,让代码更容易被他人理解、保证代码可靠性
单例设计模式:创建唯一的实例
应用场景:音乐播放对象,回收站对象,打印机对象
__new__
方法:
- 使用类名()创建对象时,Python解释器会先调用
__new__
方法为对象分配空间 __new__
是object基类提供的内置静态方法,a. 在内存中为对象分配空间。b. 返回对象的引用- python解释器获得对象的引用后,将引用作为第一个参数,传递给
__init__
方法
重写__new__
方法比较固定:
- 重写后一定要
return super().__new__(cls)
- 注意该方法为静态方法,调用时需要主动传递
cls
参数
python中的单例:
class MusicPlayer(object):
# 定义类属性记录单例对象引用
instance = None
def __new__(cls, *args, **kwargs):
# 1. 判断类属性是否已经被赋值
if cls.instance is None:
cls.instance = super().__new__(cls)
# 2. 返回类属性的单例引用
return cls.instance
"""只执行一次初始化工作,只需要再创建一个init_flag来记录初始化状态"""
class MusicPlayer(object):
# 记录第一个被创建对象的引用
instance = None
# 记录是否执行过初始化动作
init_flag = False
def __new__(cls, *args, **kwargs):
# 1. 判断类属性是否是空对象
if cls.instance is None:
# 2. 调用父类的方法,为第一个对象分配空间
cls.instance = super().__new__(cls)
# 3. 返回类属性保存的对象引用
return cls.instance
def __init__(self):
if not MusicPlayer.init_flag:
print("初始化音乐播放器")
MusicPlayer.init_flag = True
# 创建多个对象
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)
is 与 == 区别:
is
用于判断 两个变量 引用对象是否为同一个
==
用于判断 引用变量的值 是否相等