垃圾回收 | Python从入门到精通:高阶篇之三十五
特殊方法
特殊方法,也称为魔术方法。
特殊方法都是使用__开头和结尾的。例如: __init__、__del__。
特殊方法一般不需要我们手动调用,需要在一些特殊情况下自动执行。
我们去
官方文档去找一下。
我们接下来学习一些特殊方法。
定义一个Person类:
class Person(object):
"""人类"""
def __init__(self, name , age):
self.name = name
self.age = age
# 创建两个Person类的实例
p1 = Person('孙悟空',18)
p2 = Person('猪八戒',28)
# 打印p1
print(p1)
执行结果:
打印一个元组:
t = 1,2,3
print(t)
可以发现两个的执行结果不一致,是因为当我们打印一个对象时,实际上打印的是对象的中特殊方法__str__()的返回值。
__str__():
我们通过代码来看一下:
def __str__(self):
return 'Hello Person'
print(p1)
print(p2)
执行结果:、
此时我们发现打印的结果是没有意义的,想要像元组一样输出对象中的信息,我们需要修改返回值:
def __str__(self):
return 'Person [name=%s , age=%d]'%(self.name,self.age)
__str__()这个特殊方法会在尝试将对象转换为字符串的时候调用,它的作用可以用来指定对象转换为字符串的结果 (print函数)。
与__str__()类似的还有__repr__()。
__repr__():
通过代码来看一下:
def __repr__(self):
return 'Hello'
print(repr(p1))
__repr__()这个特殊方法会在对当前对象使用repr()函数时调用,它的作用是指定对象在 ‘交互模式’中直接输出的效果。
比较大小:
直接执行结果
print(p1 > p2)
通过执行结果来看,我们需要解决的是如何支持大于、小于、等于这些运算符。
object.__lt__(self, other) # 小于 <
object.__le__(self, other) # 小于等于 <=
object.__eq__(self, other) # 等于 ==
object.__ne__(self, other) # 不等于 !=
object.__gt__(self, other) # 大于 >
object.__ge__(self, other) # 大于等于 >=
我们来演示一下:
def __gt__(self , other):
return True
print(p1 > p2)
print(p2 > p1)
可以发现,如果直接返回True,不管怎么比较都是True,这是有问题的。
此时修改返回值代码:
return self.age > other.age
__gt__会在对象做大于比较的时候调用,该方法的返回值将会作为比较的结果。他需要两个参数,一个self表示当前对象,other表示和当前对象比较的对象。简单来说:
self > other
。
__len__():获取对象的长度
object.__bool__(self)
def __bool__(self):
return self.age > 17
print(bool(p1))
修改p1的age:
p1 = Person('孙悟空',8)
此时先将p1的age修改为之前的。
我们可以通过bool来指定对象转换为布尔值的情况。
我们来看一下:
if p1 :
print(p1.name,'已经成年了')
else :
print(p1.name,'还未成年了')
此时再去将年龄修改为8:
另外还有一些对对象的运算:
object.__add__(self, other)
object.__sub__(self, other)
object.__mul__(self, other)
object.__matmul__(self, other)
object.__truediv__(self, other)
object.__floordiv__(self, other)
object.__mod__(self, other)
object.__divmod__(self, other)
object.__pow__(self, other[, modulo])
object.__lshift__(self, other)
object.__rshift__(self, other)
object.__and__(self, other)
object.__xor__(self, other)
object.__or__(self, other)
我们在需要的时候去调用就可以了。这些方法都是对多态的体现。
配套视频课程,点击这里查看
获取更多资源请订阅
Python学习站