企业网站策划书1000字,北京做网站ezhixi,长沙学做网站建设,滨州做网站公司前言Python 中的特殊方法主要是为了被解释器调用的#xff0c;因此应该尽量使用 len(my_object) 而不是 my_object.__len__() 这种写法。在执行 len(my_object) 时#xff0c;Python 解释器会自行调用 my_object 中实现的 __len__ 方法。除非有大量的元编程存在#xff0c;直…前言Python 中的特殊方法主要是为了被解释器调用的因此应该尽量使用 len(my_object) 而不是 my_object.__len__() 这种写法。在执行 len(my_object) 时Python 解释器会自行调用 my_object 中实现的 __len__ 方法。除非有大量的元编程存在直接调用特殊方法的频率应远小于实现它们的次数。模拟数值类型可以通过在自定义对象中实现 __add__ 和 __mul__ 等特殊方法 令其支持 、* 等运算符。如下面的模拟向量的 Vector 类# vector.pyfrom math import hypotclass Vector:def __init__(self, x0, y0):self.x xself.y ydef __repr__(self):return fVector({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 v2Vector(4, 5) v Vector(3, 4) abs(v)5.0 v * 3Vector(9, 12)对象的字符串表示Python 有一个 repr 内置函数能把一个对象用字符串的形式表示出来。实际上这种字符串表达是通过对象内部的 __repr__ 特殊方法定义的。默认情况下在控制台里查看某个对象时输出的字符串一般是 这种形式。__repr__ 返回的字符串应该准确、无歧义并尽可能表示出该对象是如何创建的。比如前面的 Vector 对象其 __repr__ 中定义的字符串形式类似于 Vector(3, 4)和对象初始化的语法非常近似。__repr__ 和 __str__ 的区别在于__str__ 是在向对象应用 str() 函数(或者用 print 函数打印某个对象)时被调用。其返回的字符串对终端用户更友好。如果只想实现其中一个特殊方法__repr__ 应该是更优的选择。在对象没有实现 __str__ 方法的情况下Python 解释器会用 __repr__ 代替。# myclass.pyclass MyClass:def __repr__(self):return MyClassdef __str__(self):return This is an instance of MyClass from myclass import MyClass my MyClass() myMyClass 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.pyclass 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.pyclass 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