Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切。
他们是可以给你的类增加魔力的特殊方法,如果你的对象重载了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。
常见魔法方法
new(cls[, …])
在第一次遇见__init__(self[,…])方法时我们会认为对象创建时第一个调用的方法就是它,其实不是。第一次调用的方法是__new__(cls[,…])。__init__更多的是负责初始化操作,相当于一个项目中的配置文件,new__才是真正的构造函数,创建并返回一个实例对象,如果__new__只调用了一次,就会得到一个对象。它的第一个参数是这个类,其他的参数是用来直接传递给__init 方法
class TestClass:
def __init__(self):
print("调用__init__")
def __new__(cls, *args, **kwargs):
print("调用__new__")
return object.__new__(cls)#返回当前类的实例
t = TestClass()
结果
调用__init__
调用__new__
_new_ 决定是否要使用该__init__ 方法,因为__new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 new 没有返回实例对象,则__init__ 不会被调用。
class A:
pass
class B(A):
def __init__(self):
print("调用__init__")
def __new__(cls, *args, **kwargs):
print("调用__new__")
return object.__new__(A)#返回父类的实例,不会调用__init__方法
t = B()
结果:
调用__new__
del(self)
有了构造函数自然少不了析构函数。Python中__del__可以认为是析构函数了,在一个实例被销毁时它会执行。该方法是解释器自动调用的,一般情况下不重写。
class Testclass:
def __new__(cls, *args, **kwargs):
print("创建实例")
return object.__new__(cls)
def __init__(self):
print("初始化实例")
def __del__(self):
print("销毁")
print("自动调用del")
T = Testclass()
结果
创建实例
初始化实例
销毁
自动调用del
_str_(self)
当被 str() 调用时会执行__str__
_getattr_(self[,…])
当我们访问一个不存在的属性时会调用此方法,如果属性存在则不会调用。
class TestClass:
def __getattr__(self, item):
print("不存在的属性")
return item
def __init__(self,name):
self.name = name
t = TestClass("Tom")
print(t.name)
print(t.age)#age属性不存在
结果
Tom
不存在的属性
age
如果我们不重写__getattr__方法,当我们访问一个不存在的属性时会抛出AtrributeError的错误。
_getattribute_(self, item)
给方法和__getattr__方法类似,但是它更加强大,所有访问属性的行为都会调用这个方法,不仅仅是不存在的属性。
其他

本文深入探讨Python中的魔法方法,如__new__、__init__、__del__、__str__和__getattr__等,解析其工作原理及如何重写以增强类的功能。
482

被折叠的 条评论
为什么被折叠?



