python网页设计模板_Python中的特殊方法以及应用详解

前言

Python 中的特殊方法主要是为了被解释器调用的,因此应该尽量使用 len(my_object) 而不是 my_object.__len__() 这种写法。在执行 len(my_object) 时,Python 解释器会自行调用 my_object 中实现的 __len__ 方法。

除非有大量的元编程存在,直接调用特殊方法的频率应远小于实现它们的次数。

模拟数值类型

可以通过在自定义对象中实现 __add__ 和 __mul__ 等特殊方法 ,令其支持 +、* 等运算符。

如下面的模拟向量的 Vector 类:# vector.py

from math import hypot

class Vector:

def __init__(self, x=0, y=0):

self.x = x

self.y = y

def __repr__(self):

return f'Vector({self.x}, {self.y})'

def __abs__(self):

return hypot(self.x, self.y)

def __bool__(self):

return bool(self.x or self.y)

def __add__(self, other):

return Vector(self.x + other.x, self.y + other.y)

def __mul__(self, scalar):

return Vector(self.x * scalar, self.y * scalar)

运行效果如下:>>> from vector import Vector

>>> v1 = Vector(2, 4)

>>> v2 = Vector(2, 1)

>>> v1 + v2

Vector(4, 5)

>>> v = Vector(3, 4)

>>> abs(v)

5.0

>>> v * 3

Vector(9, 12)

对象的字符串表示

Python 有一个 repr 内置函数,能把一个对象用字符串的形式表示出来。实际上这种字符串表达是通过对象内部的 __repr__ 特殊方法定义的。默认情况下,在控制台里查看某个对象时,输出的字符串一般是 这种形式。

__repr__ 返回的字符串应该准确、无歧义,并尽可能表示出该对象是如何创建的。比如前面的 Vector 对象,其 __repr__ 中定义的字符串形式类似于 Vector(3, 4),和对象初始化的语法非常近似。

__repr__ 和 __str__ 的区别在于,__str__ 是在向对象应用 str() 函数(或者用 print 函数打印某个对象)时被调用。其返回的字符串对终端用户更友好。

如果只想实现其中一个特殊方法,__repr__ 应该是更优的选择。在对象没有实现 __str__ 方法的情况下,Python 解释器会用 __repr__ 代替。# myclass.py

class MyClass:

def __repr__(self):

return 'MyClass'

def __str__(self):

return 'This is an instance of MyClass'>>> from myclass import MyClass

>>> my = MyClass()

>>> my

MyClass

>>> print(my)

This is an instance of MyClass

自定义布尔值

Python 里有 bool 类型,但实际上任何对象都可以用在需要 bool 类型的上下文(比如 if 或 while 语句)中。为了判断某个值 x 的真假,Python 会调用 bool(x) 返回 True 或 False。

默认情况下,自定义类的实例总是为真。除非这个类对于 __bool__ 或 __len__ 方法有自己的实现。

bool(x) 实际上调用了对象 x 中的 __bool__ 方法。如不存在 __bool__ 方法,则 bool(x) 会尝试调用 x.__len__(),返回 0 则为 False,否则为 True。# boolclass.py

class BoolClass:

def __init__(self):

self.list = []

def add(self, item):

self.list.append(item)

def __len__(self):

return len(self.list)>>> from boolclass import BoolClass

>>> b = BoolClass()

>>> len(b)

0

>>> bool(b)

False

>>> b.add(1)

>>> len(b)

1

>>> bool(b)

True# boolclass.py

class BoolClass:

def __init__(self):

self.list = []

def add(self, item):

self.list.append(item)

def __len__(self):

return len(self.list)

def __bool__(self):

return bool(sum(self.list))>>> from boolclass import BoolClass

>>> b = BoolClass()

>>> b.add(1)

>>> len(b)

1

>>> bool(b)

True

>>> b.add(-1)

>>> len(b)

2

>>> bool(b)

False

参考资料

Fluent Python

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值