对象的创建
object类中的__ new __()方法 object类中的 __ new __()方法完成对象创建过程中的内存空间申请,对象属性初始化等一系列的操作。 (虽然我们在创建对象的时候没有写 __new __()方法,但是系统会在创建对象的时候调用object类中的__new __()方法) __ new __()方法的使用 __ new __ ()方法用于定义创建对象时执行的操作, __ new __ ()方法仅仅为用户提供一个创建对象时干预的入口,真正执行创建对象的操作由object类中的 __ new __()方法完成 __ new __()的定义 定义 __ new __()方法是对object类中 __ new __()方法的重写,重写该方法时必须再次调用object类中的 __ new __()方法
def __new__( cls,*args,**kwargs) :
.. .
instance = object.__new__( 类名)
return instance
注意事项
__ new __()方法在创建对象时自动运行,无需手工执行调用该方法 覆盖object类中的__ new __()方法后创建对象将执行覆盖后的方法 __ new __()方法仅仅是python开放出来给用户干预创建对象时的一个操作入口,该方法并不是直接完成分配内存、创建对象的操作,创建对象的操作由python底层统一管理
对象的删除
del的作用 del操作的实质是断开变量与内存数据之间的引用,操作del执行后等同于对应变量未进行过定义 del操作执行范围
删除定义的变量:功能等同于变量未定义 删除容器中的数据:将数据按照变量的形式看待,功能等同于未定义过对应数据 对象中的属性:对应对象等同于该对象未定义过该属性
__ del __方法的作用 __ del 方法用于定义对象不存在任何引用时执行的操作。当对象断开了与最后一个变量之间的引用关系时,将执行该对象的 new __方法 __ del __方法的执行范围
当手工执行断开变量与对象的最后一个引用时执行,即del操作 当程序执行完毕时,所有变量对应的引用都断开,此时执行,即退出程序
__ del __方法的调用 __ del __方法在对象断开与最后一个变量之间的引用关系时自动执行,无需手工执行调用该方法
对象判等
概念 当两个对象对应的引用地址相同时,称这两个对象是同一个对象 语法
对象名 is 对象名
变量名 is 变量名
数据 is 数据
== 与 is 的区别
==操作针对判定的内容不同,规则不同。例如:数值性数据比较数值的大小,不考虑是整数还是小数;字符串比较字符串的内容是否相同,不考虑引用地址是否相同 is 操作只针对地址进行判定,只要地址相同即返回True,否则返回False
单例模式
单例模式的作用 控制一个类只能创建出单个实例对象 语法
class 类名:
__instance = None
def __new__( cls,*args,**kwargs) :
if cls.__instance is None:
cls.__instance= object.__new__( 类名)
return cls.__instance
注意事项
定义的类变量要进行私有化,否则可以通过类名在类的外部访问到 对象的判空操作使用is进行判定
案例
"" "
办公室打印机:
一台打印机可以服务办公室中所有人,完成他们的打印任务
打印机:添加打印任务,真正的打印操作
经理:将要打印的操作加入打印机中
员工:将要打印的操作加入打印机中
" ""
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) :
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)
m1= Manager( )
pr1= Printer( )
m1.use_printer( "I am m1." ,pr1)
s1= Staff( )
pr2= Printer( )
s1.use_printer( "I am s1." ,pr2)
pr= Printer( )
pr.print( )