Python之内置的魔术方法
-
__call__
方法-
在调用对象时(实例化的对象加括号),会自动触发类中的
__call__
方法。一个对象能不能在后面加括号调用,就看这个对象所在的这个类中有没有__call__
方法。class Foo(object): def __call__(self, *args, **kwargs): print('自动触发__call__方法') foo = Foo() foo() # 自动触发__call__方法
-
-
__len__
方法-
使用
len(obj)
时,会自动触发类中的__len__
方法。需要实现len(obj)
这种用法时,类中就一定要有__len__
方法。class Foo(object): def __init__(self): self.list = [] def __len__(self): return len(self.list) foo = Foo() foo.list.append(1) foo.list.append(2) foo.list.append(3) print(len(foo.list)) # 3
-
-
__new__
方法-
__new__
是一个构造方法,在实例化对象时为对象开辟的空间,创建的类指针,用的就是__new__
方法。__new__
方法常见于单例模式,即无论实例化多少次,都只开辟一次空间。class Foo(object): __identification = None def __new__(cls, *args, **kwargs): if cls.__identification is None: cls.__identification = object.__new__(cls) return cls.__identification def __init__(self, name, age): self.name = name self.age = age foo_1 = Foo('A', 1) print(foo_1) # <__main__.Foo object at 0x000001D0B98D6C10> foo_2 = Foo('B', 2) print(foo_2) # <__main__.Foo object at 0x000001D0B98D6C10> # 注意:在Python中通过模块导入是实现单例模式最简单的方法。
-
-
__str__
方法-
在print对象时,自动触发
__str__
方法,并且必须返回一个字符串类型。__repr__
与__str__
功能相似,用str(obj)
时,总是优先调用__str__
方法,当,__str__
不存在,则会调用__repr__
方法;用repr(obj)
时,调用__repr__
方法,__repr__
方法不存在,则返回对象的内存地址。class User(): def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def __str__(self): # 当执行print(obj)时会自动执行 __str__() 方法 return F'<姓名:{self.name} 年龄:{self.age} 性别:{self.sex}>' obj = User('Python',18,'male') print(obj) # 此时相当于调用print(obj.__str__())
-
-
__del__
方法-
在对象被删除时,自动触发执行,可用于回收系统资源,也称为"析构函数"。
class MySQL(object): def __init__(self, ip, port): self.ip = ip self.port = port self.conn = connect(ip, port) # 模拟连接,需要申请系统资源 def __del__(self): self.conn.close() # 当Python程序执行完毕后,会清空所有Python占用的内存,但不会回收系统占用的内存,此时self.conn被删除后,触发 __del__() 的执行,回收系统资源 obj = MySQL('127.0.0.1', 3306)
-