魔术方法

发布时间:2025-08-31 21:38:30 作者:益华网络 来源:undefined 浏览量(0) 点赞(0)
摘要:今天我们学习魔术方法,听这个名字我们可能完全不知道这是个什么,其实魔术方法就是在我们定义的类中定义一些”不一般”的方法,使类的使用更方便、完善、健壮,是python特有的方法,一般都是前后包含两个下划线__的方法称为魔术方法,例如__new__。 基本魔

今天我们学习魔术方法,听这个名字我们可能完全不知道这是个什么,其实魔术方法就是在我们定义的类中定义一些”不一般”的方法,使类的使用更方便、完善、健壮,是python特有的方法,一般都是前后包含两个下划线__的方法称为魔术方法,例如__new__。

基本魔术方法有哪些 __new__:是在一个对象实例化的时候所调用的第一个方法,用来创建类并返回这个类的实例; classStudent:def __init__(self):print("__init__()调用")def __new__(cls,*args,**kwargs):print(__new__()调用, {cls}.format(cls=cls))returnobject.__new__(cls,*args,**kwargs)stu =Student()# 输出结果:__new__()调用,<class__main__.Student>__init__()调用很明显可以看出,先调用了__new__方法,然后调用了__init__方法

__init__:构造器,是一个初始化方法,在一个实例被创建之后调用;

__del__:析构器,当一个实例被销毁的时候调用的方法;

__bool__:如果对象实现了bool方法,那么返回结果,非0为真,如果没有实现bool方法,调用len方法,返回非0为真;

__hash__:返回一个整数,表明对象可以hash;

__repr__:返回对象的字符串表达式,如果没有实现,直接返回对象内存地址字符串;

__str__:str()、print()、format()函数打印对象字符串,会直接调用str方法,如果没有实现,会调用repr方法;

__hash__:定义当被 hash() 调用时的行为;

__bytes__:定义当被 bytes() 调用时的行为;

__format__:定义当被 format() 调用时的行为;

有关属性魔术方法有哪些

__getattr__:定义当用户试图获取一个不存在的属性时的行为;

__setattr__:定义当一个属性被设置时的行为;

__getattribute__:定义当该类的属性被访问时的行为;

__delattr__:删除一个属性时执行的方法;

__dir__:定义当 dir() 被调用时的行为;

__get__:定义当描述符的值被取得时的行为;

__set__:定义当描述符的值被改变时的行为;

__delete__:定义当描述符的值被删除时的行为;

运算符相关魔术方法有哪些

我们通过一小实例来看一下,有关于运算符相关的魔术方法的使用

classStudent:def __init__(self, x):self.x = xdef __add__(self, other):returnself.x + other.xdef __sub__(self, other):returnself.x - other.xdef __mul__(self, other):returnself.x * other.xa =Student(1)b =Student(2)c =Student(3)print(b-a)# 输出:1print(b+a)# 输出:3print(b*c)# 输出:6

__add__:定义加法的方法;

__sub__:定义减法的方法;

__mul__:定义乘法的方法;

__truediv__:定义除法的方法;

__floordiv__:定义整数除法的行为://;

__mod__:定义取模算法的行为:%;

__divmod__:定义当被 divmod() 调用时的行为;

__pow__:定义当被 power() 调用或 ** 运算时的行为;

__lshift__:定义按位左移位的行为:<<;

__rshift__:定义按位右移位的行为:>>;

__and__:定义按位与操作的行为:&;

__xor__:定义按位异或操作的行为:^;

__or__:定义按位或操作的行为:|;

比较操作符相关魔术方法有哪些

有关于比较操作符的魔术方法也有很多,下面例子中有__eq__和__lt__的举例,大家自己动手把所有的方法都操作一遍,就能很快理解操作符相关魔术方法的使用了

classStudent(object):def __init__(self, a, b, c):self.a = aself.b = bself.c = cdef __eq__(self, other):returnTrueifself.a == other.a elseFalsedef __lt__(self, other):ifself.a < other.a:returnTrueelse:returnFalsestu1 =Student(1,2,3)stu2 =Student(3,2,1)stu3 =Student(1,2,3)print(stu1 == stu2)# 输出:Falseprint(stu1 == stu3)# 输出:Trueprint(stu1 < stu2)# 输出:Trueprint(stu1 < stu3)# 输出:False

__eq__:定义等于号的方法,等价于==;

__lt__:定义小于号方法,等价于<;

__gt__:定义大于号方法,等价于>;

__le__:定义小于等于号的行为,等价于 <= ;

__ne__:定义不等号的行为,等价于!= ;

__ge__:定义大于等于号的行为,等价于 >= ;

容器相关的魔术方法有哪些classStudent:def __init__(self):self.items ={}def __len__(self):return len(self.items)# 如果stu.items不为空,返回Truedef __bool__(self):returnTrueif len(self)elseFalsedef __iter__(self):return iter(self.items)def __getitem__(self, item):returnself.items[item]def __setitem__(self, key, value):self.items[key]= valuestu=Student()stu.items[Course]=Pythonstu.items[Teacher]=张三print(len(stu))print(bool(stu))print(iter(stu))print(stu[Course])stu[Course]=HTMLprint(stu[Course])

__len__:定义当被 len() 调用时的行为(返回容器中元素的个数);

__iter__:定义当迭代容器中的元素的行为;

__getitem__:获取容器中的元素,相当于 self[key];

__setitem__:设置容器中的元素,相当于 self[key] = value;

__delitem__:删除容器中的某个元素,相当于 del self[key];

__reversed__:定义当被 reversed() 调用时的行为;

__contains__:定义当使用成员测试运算符(in 或 not in)时的行为;

可调用对象# 函数是可调用对象def add():passadd.__call__()add()# 类实现了__call__方法classAdd():def __call__(self,*args,**kwargs):print(args)print(kwargs)add_instance =Add()add_instance.__call__(1,2,3, course=Python)add_instance(1,2,3,course=Python)

Python中,实现了call方法的对象都是可调用对象;

__call__:允许一个类的实例像函数一样被调用:x(a, b)调用为 x.__call__(a, b);

更多魔术方法的详情可以参考python官网:https://docs.python.org/3/reference/datamodel.html学习视频:https://www.9xkd.com/user/plan-view.html?id=3623904578

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!