前言

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

python中布尔类型是特殊的_Python中的特殊方法以及应用详解相关推荐

  1. 在python中布尔类型的值包括_Python中布尔类型

    我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算: 与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and ...

  2. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  3. python中布尔类型的值包括_Python 布尔值(Booleans)

    1.布尔值(Booleans) 在编程中,您通常需要知道表达式是True还是False. 您可以评估Python中的任何表达式,并获得两个答案之一,True或False. 比较两个值时,将对表达式求值 ...

  4. python 获取值类型用于定义变量_Python中的变量和简单数据类型

    变量: 变量是存储在内存中的值,在创建变量时会在内存中开辟一个空间. 变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符串. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存 ...

  5. python中common在哪个模块导入_python的常用模块之collections模块详解

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...

  6. python脚本语言采用声音作为手段_python 利用pyttsx3文字转语音过程详解

    这篇文章主要介绍了python 利用pyttsx3文字转语音过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下# -*- coding: utf ...

  7. python列表是顺序表还是链表_Python数据结构与算法(链表使用详解)

    链表 单向链表 p是头节点,指向第一个值,最后一个是伪节点,因为不指向地址. 表元素域elem用来存放具体的数据 链接域next用来存放下一个节点的位置(python中的标识) 变量p指向链表的头节点 ...

  8. python创建文件夹和文件夹_Python快捷创建文件夹和文件详解

    Python快捷创建文件夹和文件详解 自己做文件时发现  简单的反复操作十分浪费时间,于是想到了 使用Python,这个分享给大家,快捷高效办公. 1.创建文件夹 # 批量 创建文件夹 import ...

  9. python中布尔值是什么意思_Python中的布尔值

    表达式的真值存储为称为bool的python数据类型.此数据类型中只有两个这样的值.真假. 布尔数据类型 在下面的程序中,我们找到True和False布尔值的数据类型. 示例print(True) p ...

最新文章

  1. 账簿登记重要十条规则
  2. 5.8 正则化和数据标准化
  3. 【渝粤题库】陕西师范大学180208 产品管理 作业(专升本)
  4. oracle 最小权限,oracle低权限下获取shell
  5. 怎么分辨是不是外包工司_花2万做外装农村自建房秒变别墅,农村工头:这还让人怎么混?...
  6. 【python写一个无限弹窗】
  7. 三年级下册计算机知识点,【北师大】三年级下册语文各单元知识点归纳
  8. 「 iOS 知识小集 」2018 · 第 24 期
  9. 基于Java的网上手机销售系统的设计与实现(附:源码 论文 sql文件 部署视频)
  10. 虚函数,虚函数表,虚函数实现原理,虚函数实现机制,虚函数解决的问题
  11. 微软Windows 11正式发布!(文末送书)
  12. stc8实用外部晶振程序
  13. 愿世间美好与你环环相扣
  14. 2018 php 参考文献,现代简约设计参考文献2018
  15. 方舟生存进化是什么游戏?好不好玩
  16. unity 彩带粒子_Unity3D_(Shuriken粒子系统)制作简单的烟花爆炸效果
  17. 档案管理在计算机中的应用,计算机信息技术在档案管理中的应用论文原稿
  18. .NetCore——基于OpenCV人脸检测
  19. 智慧政务 | 云计算赋能传统政务升级
  20. 录屏工具哪个好?手机、电脑录屏都ok

热门文章

  1. 某人想在h小时内钓到_为某人命名以重新连接到您的服务器
  2. java ee7帮助文档_帮助推动Java EE向前发展
  3. javaone_JavaOne和OOW 2015总结
  4. 海盗云商插件_推销自己的海盗猫王运营商
  5. Java 14的新功能
  6. 您想了解的所有Throwable
  7. Spring Boot中的@SpringBootConfiguration注释
  8. 红帽 jboss_红帽正式宣布发布JBoss BPM Suite 6和JBoss BRMS 6
  9. mapreduce 算法_MapReduce算法–了解数据联接第二部分
  10. tomcat web应用_具有可执行Tomcat的独立Web应用程序