python魔术方法
参考链接:https://pyzh.readthedocs.io/en/latest/python-magic-methods-guide.html#id13
一、构造方法
__new__
:创建类实例
0)触发时机::创建类对象
1)使用方法:
def __new__(cls, *args, **kargs):
# do something
return super.__new__(cls, *args, **kargs) # 调用父类的__new__方法返回实例对象
-
cls:类本身
-
*args:位置传参,参数存为LIST类型
-
**kargs:关键字传参,参数存为DICT类型
-
return:创建的实例对象
**2)作用:**开辟内存空间,实例化类对象
3)使用场景:
- 单例模式
- 工厂模式Factory
- 继承不可变类型
4)其他创建类对象时,先执行__new__
方法,再执行__init__
方法
__init__
:初始化函数
0)触发时机::创建类对象
1)使用方法:
def __init__(self, *args, **kargs):
self.name = "petty"
- self:实例对象
- *args:位置传参,参数存为LIST类型
- **kargs:关键字传参,参数存为DICT类型
- return:无返回值
**2)作用:**为类对象成员赋值
__del__
:对象销毁器
0)触发时机::当对象执行垃圾回收操作时
1)使用方法:
def __del__(self):
pass
- self:实例对象
- return:无返回值
**2)作用:**在销毁对象时关闭资源
使用实例:文件的打开与关闭
from os.path import join
class FileObject:
def __init__(self, path, filename):
self.f = open(join(path,filename),'r+')
def __del__(self):
self.f.close()
del self.f
二、操作符方法
1、比较操作符
表格总结
方法 | 作用 |
---|---|
__cmp__(self, other) | 比较方法里面最基本的的魔法方法 |
__eq__(self, other) | 定义相等符号的行为,== |
__ne__(self,other) | 定义不等符号的行为,!= |
__lt__(self,other) | 定义小于符号的行为,< |
__gt__(self,other) | 定义大于符号的行为,> |
__le__(self,other) | 定义小于等于符号的行为,<= |
__ge__(self,other) | 定义大于等于符号的行为,>= |
缩写表示
__camp__
:__eq__
:equal(=)__ne__
:not equal(!=)__lt__
:less than(<)__gt__
:greater than(>)__le__
:less and equal(<=)__ge__
:greater and equal(>=)
使用实例:单词的长度比较
class Word(str):
'''单词类,按照单词长度来定义比较行为'''
def __new__(cls, word):
# 注意,我们只能使用 __new__ ,因为str是不可变类型
# 所以我们必须提前初始化它(在实例创建时)
if ' ' in word:
print("Value contains spaces. Truncating to first space.")
word = word[:word.index(' ')]
# Word现在包含第一个空格前的所有字母
return str.__new__(cls, word)
def __gt__(self, other):
return len(self) > len(other)
def __lt__(self, other):
return len(self) < len(other)
def __ge__(self, other):
return len(self) >= len(other)
def __le__(self, other):
return len(self) <= len(other)
if __name__ == "__main__":
print(Word('foo') < Word('bars'))
2、数值操作符
单目运算符和函数
方法 | 作用 |
---|---|
__pos__(self) | 实现一个取正数的操作 |
__neg__(self) | 实现一个取负数的操作 |
__abs__(self) | 实现一个内建的 abs() 函数的行为 |
__invert__(self) | 实现一个取反操作符(~操作符)的行为 |
__round__(self, n) | 实现一个内建的 round() 函数的行为 |
__floor__(self) | 实现 math.floor() 的函数行为 |
__ceil__(self) | 实现 math.ceil() 的函数行为 |
__trunc__(self) | 实现 math.trunc() 的函数行为 |
双目运算符或函数
方法 | 作用 |
---|---|
__add__(self, other) | 实现一个加法 |
__sub__(self, other) | 实现一个减法 |
__mul__(self, other) | 实现一个乘法 |
__floordiv__(self, other) | 实现一个 // 操作符产生的整除操作 |
__div__(self, other) | 实现一个 / 操作符代表的除法操作 |
__truediv__(self, other) | 实现真实除法 |
__mod__(self, other) | 实现一个 % 操作符代表的取模操作 |
__divmod__(self, other) | 实现一个内建函数 divmod() |
__pow__(self, other) | 实现一个指数操作( ****** 操作符)的行为 |
__lshift__(self, other) | 实现一个位左移操作**(<<)**的功能 |
__rshift__(self, other) | 实现一个位右移操作**(>>)**的功能 |
__and__(self, other) | 实现一个按位进行与操作**(&)**的行为 |
__or__(self, other) | 实现一个按位进行或操作的行为 |
__xor__(self, other) | 异或运算符相当于 ^ |
增量运算
方法 | 作用 |
---|---|
__iadd__(self, other) | 加法赋值 |
__isub__(self, other) | 减法赋值 |
__imul__(self, other) | 乘法赋值 |
__ifloordiv__(self, other) | 整除赋值,地板除,相当于 //= 运算符 |
__idiv__(self, other) | 除法赋值,相当于 /= 运算符 |
__itruediv__(self, other) | 真除赋值 |
__imod_(self, other) | 模赋值,相当于 %= 运算符 |
__ipow__(self, other) | 乘方赋值,相当于 **= 运算符 |
__ilshift__(self, other) | 左移赋值,相当于 <<= 运算符 |
__irshift__(self, other) | 左移赋值,相当于 >>= 运算符 |
__iand__(self, other) | 与赋值,相当于 &= 运算符 |
__ior__(self, other) | 或赋值 |
__ixor__(self, other) | 异或运算符,相当于 ^= 运算符 |
三、类的表示
__str__
:面向用户的表示
1)触发方式:调用str(d)或print(d)
>>>import datetime
>>>d = datetime.datetime.now()
>>>str(d)
'2023-02-23 16:06:50.966215'
>>>print(d)
2023-02-23 16:06:50.966215'
2)使用实例:
class Student(object):
def __init__(self, name):
self.name = name
def __str__(self):
return "name:%s" % self.name
s = Student('Petty')
print(s)
print(str(s))
print(repr(s))
--------------------运行结果----------------
name:Petty
name:Petty
<__main__.Student object at 0x00000120A21C5910>
__repr_
:面向开发者的表示
1)触发方式:调用repr(d)或者直接输出对象d【交互模式下】,以及当类对象没有定义__str__
方法并执行print(d)语句时
>>>import datetime
>>>d = datetime.datetime.now()
>>>repr(d)
'datetime.datetime(2023, 2, 23, 16, 6, 50, 966215)'
>>>d
'datetime.datetime(2023, 2, 23, 16, 6, 50, 966215)'
2)使用实例:
class Student(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return "姓名:%s" % self.name
s = Student('Petty')
print(s)
print(str(s))
print(repr(s))
--------------运行结果------------
姓名:Petty
姓名:Petty
姓名:Petty
__dir__
:类的属性和方法名
1)作用:返回类的所有属性和方法名,是字典类型,dir()即调用该属性
2)实例:
class Student:
name = "petty"
age = 18
def __init__(self): pass
def hello(self): pass
def goodbye(self): pass
s = Student()
s.__dir__()
四、访问控制attr
__getattr__
:获取对象属性
1)触发时机:获取对象属性时,进行的操作
2)使用方法:
def __getattr__(self, name, default):
# do something
return super.__getattr__(self, name, default) # 调用父类的__getattr__方法返回实例对象
- self:实例对象
- name:实例属性名
- default:当该属性不存在时的默认值
__setattr__
:设置对象属性
1)触发时机:设置对象属性时,进行的操作
2)使用方法:
def __setattr__(self, name, value):
# do something
return super.__getattr__(self, name, value) # 调用父类的__setattr__方法返回实例对象
- self:实例对象
- name:实例属性名
- value:设置值
__delattr__
:删除对象属性
1)触发时机:销毁对象的属性时,进行的操作
2)使用方法:
def __delattr__(self, name):
# do something
return super.__delattr__(self, name) # 调用父类的__delattr__方法返回实例对象
-
self:实例对象
-
name:实例属性名