活动地址:CSDN21天学习挑战赛
在应用方面,Python比其他编程语言的功能更为丰富,关键在于Python有大量的,魔法方法与魔法属性。
一、魔法方法
Python内置了许多方法,这些方法在执行特定操作时会自动调用,这些方法称为魔法方法或者魔术方法。_init_与_del_也是魔法方法。魔法方法的名称前后有两根下划线,表示这些方法由Python解释器专用。开发者在定义普通方法时,需要避免使用两根下划线来命名。以下为目前最常见的模式方法。
1._new_与_init_
Python中的类有两种,即经典类与新式类。经典类是指直接申明的,不显示从object继承,具体如下所示
class MyClass:
def_init_(self,val):
self._val=val
在创建某个类型的实例时,首先会调用_new_方法,_new_方法会返回该类型的实例,并自动调用_init_方法,同时将实例作为self参数传递到_init_方法中。
_new_方法负责创建实例,_init_方法负责初始化实例,如下所示
class FileOperate:
def_init_(self,path):
print("执行_init_方法!")
self._path=path
def_new_(cls,*args,**kwargs):
print("执行_new_方法!")
print("cls:",cls)
obj=object._new_(cls)
if isinstance(obj,cls):
print("obj是cls的实例")
return obj
file_operate_obj=FileOperate(r"C:\pythonProject\1.txt")
执行结果如下,输出_new_和_init_执行过程
执行_new_方法!
cls:<class'_main_.FileOperate'>
obj是cls的实例
执行_init_方法!
_new_方法还可以选择是否自动调用,如下所示,在_new_方法中不返回cls的实例,就不会自动调用_init_方法了。在第14行,访问实例的_path属性时,就会提示错误。
class FileOperate:
def_init_(self,path):
print("执行_init_方法!")
self._path=path
def_new_(cls,*args,**kwargs):
print("执行_new_方法!")
print("cls:",cls)
pass
try:
file_operate_obj=FileOperate(r"C:\pythonProject\1.txt")
print("_path的值为:",file_operate_obj._path)
except Exception as e:
print("错误信息:",e)
执行结果如下,输出错误信息。
执行_new_方法!
cls:<class'_main_.FileOperate'>
错误信息:'NoneType'object has no attribute '_path'
2._str_、_repr_与_format_
_str_、_repr_与_format_都是将对象转换成字符串,只是调用场景不同,如下所示。在FileOperate类中,在第6行定义_str_方法,表示将对象以字符串的形式返回,在第9行定义_repr_方法,表示在控制台直接输出对象。在第12行定义_format_方法,表示将对象格式化输出。
class FileOperate:
def_init_(self,path):
self._path=path
def_str_(self):
return"调用_str_方法!"
def_repr_(self):
return"调用_repr_方法!"
def_format_(self,*args):
return"调用_format_方法!"
file_operate_obj=FileOperate(r"C:\pythonProject\1.txt")
print("将对象直接打印到屏幕时:")
print(file_operate_obj)
print("\n调用format方法做格式化输出时:")
print("{}".format(file_operate_obj))
将此脚本文件命名为test1.py,在test1.py同一目录下打开Python命令行窗口。在Python的Shell窗口中使用import导入FileOperate对象,就会执行第15行至第20行代码,此时就会自动调用_str_与_format_方法。在窗口中直接输入f对象,就会自动调用_repr_方法。