Python 面向对象

面向对象(封装,继承,多态)

  • 一个对象的 属性 可以是 另外一个类创建的对象
  • 私有属性和私有方法:访问方法,在 名称 前面加上 _类名 => _类名__名称就可以访问了
继承(体现出多态)

对父类方法进行扩展:

  • 在子类中重写父类方法,在需要的位置调用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 用于判断 两个变量 引用对象是否为同一个
== 用于判断 引用变量的值 是否相等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值