众所周知,Python有一系列的以__
(双下画线)开头和结尾的属性和方法,它们都是Python预先定义好的,具有一定含义的函数。比如__init__(self)
就是类在实例化时会执行的方法。但是如果你查看Python源码,就会发现有些类的方法并不止__init__()
、__str__()
、__del__()
、__repr__()
。这些函数统称为魔法函数。通过定义魔法函数可以给对象增加许多不需要直接调用方法就可以操作对象的方法,比如让对象相加。下面就一一列举Python中常用的魔法函数。
类和对象有关
__init__(self)
__init__(self)
函数在对象实例化后被调用,它的第一个参数通常命名为self,表示对自身对象的引用。一般在这个函数中执行对对象成员变量赋值的操作。
class Demo:
def __init__(self):
print('对象初始化时调用')
Demo()
# 对象初始化时调用
__new__(cls, *args, **kwargs)
__new__(cls, *args, **kwargs)
函数在对象初始化时调用,但是此方法不常用。通常情况下在创建不可变对象时需要重写此方法,并在函数体里对对象不可变的变量赋值。
class Demo:
def __new__(cls, *args, **kwargs):
obj = super().__new__(cls)
print('创建对象时调用')
obj.static = None
return obj
def __init__(self, value=None):
self.value = value
print('对象初始化时调用')
Demo()
# 创建对象时调用
# 对象初始化时调用
__del__(self)
__del__(self)
在对象删除时被调用,一般可用于写入日志、关闭连接、释放资源等操作。
class Demo:
def __init__(self, value=None):
self.value = value
print('对象初始化时调用')
def __del__(self):
print('对象被删除时被调用')
Demo()
# 对象初始化时调用
# 对象被删除时被调用
输出有关
__str__(self)
__str__(self)
返回一个字符串,用于表示对象的可打印版本。通常在调用str()
函数或使用print()
函数时被自动调用。
class Demo:
def __str__(self):
return f'<Class Demo at {hex(self.__hash__())}>'
d = Demo()
print(d)
# <Class Demo at 0x1ac981b499>
__repr__(self)
__repr__(self)
返回一个字符串,用于表示对象的“官方”字符串表示。通常在调试和开发过程中使用。
__len__(self)
__len__(self)
返回对象的长度。通常在调用len()
函数时被自动调用。
class Demo:
def __init__(self, *args):
self.list = args
def __str__(self):
return str(self.list)
def __len__(self):
return len(self.list)
d = Demo(1, 2, 3)
print(d, len(d))
# (1, 2, 3) 3
列表、元组属性有关
__iter__(self)
: 返回一个迭代器对象,用于支持对象的迭代。通常在使用for
循环迭代对象时被自动调用。__next__(self)
: 在迭代器中,返回下一个值。通常在调用next()
函数或使用for
循环遍历迭代器时被自动调用。__contains__(self, item)
: 用于判断对象是否包含某个元素。通常在使用in
关键字来检查对象是否包含某个元素时被自动调用。
class Demo:
def __init__(self, *args):
self.list = args
def __iter__(self):
return iter(self.list)
def __contains__(self, item):
return item in self.list
d = Demo(1, 2, 3)
for i in d:
print(i) # 1\n2\n3
print(1 in d) # True
print(4 in d) # False
字典属性有关
__getattr__(self, name)
: 在属性查找失败时被调用,用于返回指定属性的值。__setattr__(self, name, value)
: 在设置对象属性值时被调用。通常用于拦截属性的赋值操作。__delattr__(self, name)
: 在删除对象属性时被调用。通常用于拦截属性的删除操作。
class Demo:
def __init__(self, **kwargs):
self.dict = kwargs
def __setitem__(self, key, value):
self.dict[key] = value
def __getitem__(self, item):
return self.dict[item]
def __delitem__(self, key):
del self.dict[key]
def __str__(self):
return str(self.dict)
d = Demo(a=1, b=2, c=3)
print(d['a']) # 1
d['b'] = 4
print(d['b']) # 4
del d['c']
print(d) # {'a': 1, 'b': 4}
看到这里相信你也对魔法函数有了一定的了解,以下就只列举出其他的魔法函数,不再给出例子。
其他魔法函数
__getitem__(self, key)
: 用于支持通过索引或键访问对象的元素。通常在使用索引或键访问对象时被自动调用。__setitem__(self, key, value)
: 用于支持通过索引或键设置对象的元素值。通常在使用索引或键设置对象的元素值时被自动调用。__delitem__(self, key)
: 用于支持通过索引或键删除对象的元素。通常在使用索引或键删除对象的元素时被自动调用。__ne__(self, other)
: 用于对象的不等性比较。通常在使用!=
运算符进行对象间的比较时被自动调用。__eq__(self, other)
: 用于对象的相等性比较。通常在使用==
运算符进行对象间的比较时被自动调用。__lt__(self, other)
: 用于对象的小于比较。通常在使用<
运算符进行对象间的比较时被自动调用。__gt__(self, other)
: 用于对象的大于比较。通常在使用>
运算符进行对象间的比较时被自动调用。__call__(self, ...)
: 允许将对象作为函数调用。通过重写__call__
方法,我们可以使对象具有函数的行为。__enter__(self)
,__exit__(self, exc_type, exc_value, traceback)
: 用于定义对象在使用with
语句时的上下文管理器。__enter__
方法在进入上下文时被调用,__exit__
方法在离开上下文时被调用。__add__(self, other)
: 用于对象的加法操作。通常在使用+
运算符进行对象间的加法操作时被自动调用。__sub__(self, other)
: 用于对象的减法操作。通常在使用-
运算符进行对象间的减法操作时被自动调用。__mul__(self, other)
: 用于对象的乘法操作。通常在使用*
运算符进行对象间的乘法操作时被自动调用。__div__(self, other)
: 用于对象的除法操作。通常在使用/
运算符进行对象间的除法操作时被自动调用。__floordiv__(self, other)
: 用于对象的地板除操作。通常在使用//
运算符进行对象间的地板除操作时被自动调用。__mod__(self, other)
: 用于对象的取模操作。通常在使用%
运算符进行对象间的取模操作时被自动调用。__pow__(self, other[, modulo])
: 用于对象的指数操作。通常在使用**
运算符进行对象间的指数操作时被自动调用。
这里讲的不全,应该顺带讲讲真、假私有函数
这个云笔记里有就没打算写,我的云笔记感觉Python挺全的
暂无点赞
暂无点赞
过来看看! 😀
感谢支持!你的博客内容看起来有待进步呢,加油!
就是没事水一水
暂无点赞
暂无点赞
暂无点赞