python 基础之对象管理

一、对象的创建

1、__new__方法的作用

__new__方法用于定义创建对象时执行的操作,__new__方法仅仅为用户提供一个创建对象时干预的入口,真正执行创建对象的操作由object类中的__new__方法完成。

2、__new__方法的定义

定义__new__方法是对 object 类中的方法的重写,重写该方法时必须再次调用 object 类中的__new__方法.

def __new__(cls, *args, **kwargs):
    if cls.__instance is None:
        cls.__instance = object.__new__(Printer)
    return cls.__instance

复制代码
3、__ new__ 方法的调用
__new__方法在创建对象时自动运行,无需手工执行调用该方法。
复制代码

二、对象的删除

1、del操作的作用

del操作的实质是断开变量与内存数据之间的引用,操作del执行后等同于对应变量未进行过定义。

2、del 操作执行的范围
1.删除定义的变量:功能等同于变量未定义
2.删除存储模型中的数据:将数据按照变量的形式看待,功能等同于未定义过对应的数据
  • 列表数据报错:索引不存在
  • 元组对象报错:元组对象不支持对项的删除
  • 字典对象报错:键错误,键不存在
3.对象中的属性:对应对象等同于该对象未定义过该属性
3、__del__方法作用

__del__方法用于定义对象不存在任何引用时执行的操作。当对象断开了与最后一个变量之间的引用关系时,将执行该对象的__new__方法。

4、__del__方法执行范围

1.当手工执行断开变量与对象的最后一个引用时执行,即del操作

2.当程序执行完毕时,所有变量对应的引用都断开,此时执行,即退出程序

5、__del__方法调用

__del__方法在对象断开与最后一个变量之间的引用关系时自动执行,无需手工执行调用该方法。

三、对象判等
1、对象判等概念
  • 当两个对象对应的引用地址相同时,称这两个对象是同一个对象。
2、对象判等语法格式
对象引用地址判等:
    对象名 is 对象名  或	变量名 is 变量名
数据引用地址判定:
    数据 is 数据
注:判等操作的结果是True或False
复制代码
3、 ==与is的区别
  • ==操作针对判定的内容不同,规则不同。例如数值性数据比较数值的大小,不考虑是整数还是小数。字符串比较字符串的内容是否相同,不考虑引用地址是否相同。
  • is操作只针对地址进行判定,只要地址相同即返回True,否则返回False
四、单例模式
1、单例模式的作用

控制一个类只能创建出单个实例对象。

2、单例模式书写规范
class Printer:
    __instance = None

    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = object.__new__(Printer)
        return cls.__instance
复制代码
3、注意事项
  • 1.定义的类变量要进行私有化,否则可以通过类名在类的外部访问到
  • 2.对象的判空操作使用is进行判定

案例:办公室打印机

"""
案例:办公室的打印机
一台打印机可以服务于一个办公室中所有的人,完成他们的打印任务。
分析:
1.打印机:将要打印的任务添加到打印的任务队列中,真正的打印操作
2.经理:将要打印的操作加入打印机中
3.员工:将要打印的操作加入打印机中
"""
class Manager:
    def use_printer(self,info,pr):
        pr.add_task(info)

class Staff:
    def use_printer(self,info,pr):
        pr.add_task(info)

class Printer:
"""典型的单例模式"""
    __instance = None

    def __new__(cls, *args, **kwargs):
    """通过重写__new__方法来实现只创建一个对象"""
        if cls.__instance is None :
            cls.__instance = object.__new__(Printer)
        return cls.__instance

    def __init__(self,list_print = []):
        self.list_print = list_print

    def add_task(self,info):
        """添加打印信息到打印队列中"""
        self.list_print.append(info)

    def print(self):
        print(self.list_print)

# 程序员A:
pr1 = Printer()  # 创建打印机对象
m1 = Manager()  # 创建一个经理对象
m1.use_printer("hello",pr1) 

# 程序员B:
pr2 = Printer()
st1 = Staff()
st1.use_printer("itcast",pr2)

# 程序员B1:
pr3 = Printer()
st2 = Staff()
st2.use_printer("itcast666",pr3)

# 程序员C:
pr = Printer()
pr.print()

复制代码