我们先暂且称呼为特殊方法。

单下划线开头(_foo) 双下划线开头的(__foo) 双下划线开头和结尾的( __foo__)
代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入; 代表类的私有成员 代表python里特殊方法专用的标识,如 _init_()代表类的构造函数

文章目录

  • 1 __repr__方法
  • 2 __str__ 方法
  • 3 __str__ and __repr__ example
  • 4 python 类中的self是是什么
  • 5 python3中的__slots__
  • 6. __call__方法
  • 7. 对象表现形式(__bytes__)
  • 8.str.format()的简单用法
    • 字段名:省略;数字;变量名
    • 转换字段: !s !r !a

1 __repr__方法

_repr__是类的内建方法,所有的类都是继承自Object类,因此在外部调用时,需要使用repr函数,好比Node类通过重写__repr_,从而重写了repr。
这是文档上标注的,因为理解不太贴切,所以还是放上官方介绍吧。

Return a string containing a printable representation of an object.
For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to eval(), otherwise the representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object.
A class can control what this function returns for its instances by defining a repr() method.

class Node(object):def __init__(self, value, flag = 1):self._value = valueself._children = []self._flag = flagdef add_child(self, node):self._children.append(node)def __repr__(self):return 'Node({!r})'.format(self._value)if __name__ == '__main__':n1 = Node(0)print(n1)#Node(0)

2 str 方法

此方法返回对象的字符串表示形式。在对象上调用print()或str()函数时调用此方法。
这个方法必须返回String对象。如果我们没有为类实现_str__()函数,那么使用内置的对象实现来实际调用_repr__()函数。

3 str and repr example

我们注意到无论是__str__还是__repr__方法,返回的都要求是str类型

class Person(object):name = ""age = 0def __init__(self, personName, personAge):self.name = personNameself.age = personAgedef __repr__(self):return '{name'+self.name + ',' + 'age:' + str(self.age) + '}'def __str__(self):return 'Person(name=' + self.name + ', age=' + str(self.age) + ')'p = Person('Pankaj', 34)
# __str__() example
print(p) #Person(name=Pankaj, age=34)
# print(p.__str__())#Person(name=Pankaj, age=34)
# s = str(p)
# print(s)#Person(name=Pankaj, age=34)
#
# # __repr__() example
# print(p.__repr__())
# print(type(p.__repr__()))
# print(repr(p))

we mentioned that if we don’t implement str function then the repr function is called. Just comment the str function implementation from Person class and print§ will print {name:Pankaj, age:34}.我们发现,__str__的优先级是大于__repr__的。

4 python 类中的self是是什么

self指的是类实例对象本身(注意:不是类本身)。

5 python3中的__slots__

当一个类需要创建大量实例时,可以通过__slots__声明实例所需要的属性,

例如,class Foo(object): slots = [‘foo’]。这样做带来以下优点:

  • 更快的属性访问速度
  • 减少内存消耗

使用__slots__也是有副作用的:

1. 每个继承的子类都要重新定义一遍__slots__
2. 实例只能包含哪些在__slots__定义的属性,这对写程序的灵活性有影响,比如你由于某个原因新网给instance设置一个新的属性,比如instance.a = 1, 但是由于a不在__slots__里面就直接报错了,你得不断地去修改__slots__或者用其他方法迂回的解决
3. 实例不能有弱引用(weakref)目标,否则要记得把__weakref__放进__slots__

另外参考:https://zhuanlan.zhihu.com/p/25930288

6. __call__方法

一个函数(甚至对象)之所以能执行,关键就在于 call() 方法。实际上 x(arg1, arg2,…) 只是 x.call(arg1, arg2, …) 的快捷写法,因此我们甚至可以为自定义类添加 _call_ 方法,从而使得该类的实例也变成可调用的。例如如下代码:

# 定义Role类
class Role:def __init__ (self, name):self.name = name# 定义__call__方法def __call__(self):print('执行Role对象')
r = Role('管理员')
# 直接调用Role对象,就是调用该对象的__call__方法
r()# 执行Role对象

上面程序中最后一行代码使用调用函数的语法来调用对象,这看上去似乎是错误的,但由于该 Role 类提供了\ call 方法,因此调用对象的本质就是执行该对象的 _call_ 方法。运行上面代码,将看到如下输出结果:

对于程序中的函数,同样既可使用函数的语法来调用它,也可把函数当成对象,调用它的 call 方法。例如如下示例代码:

def foo ():print('--foo函数--')
# 下面示范了2种方式调用foo()函数
foo()
foo.__call__()
运行上面代码,可以看到 foo() 和 foo.__call__() 的效果完全相同。

7. 对象表现形式(bytes)

在 Python 3 中,

  • _repr_、_str_ 和 _format_ 都必须返回 Unicode 字符串(str 类型)。
  • 只有_bytes_ 方法应该返回字节序列(bytes 类型)。

8.str.format()的简单用法

字段名:省略;数字;变量名

‘name is {}, age is {}’.format(‘peter’,25)
‘name is {1}, age is {0}’.format(25, ‘peter’)
‘name is {name}, age is {age}’.format(name=‘peter’,age=‘25’)

转换字段: !s !r !a

  • s:传递参数之前先对参数调用 str()
  • r:传递参数之前先对参数调用 repr()
  • a:传递参数之前先对参数调用 ascii()

例子:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return 'Person({0.name!r}, {0.age!r})'.format(self)def __str__(self):return '({0.name!s}, {0.age!s})'.format(self)person = Person('peter', 25)
'this person is {!r}'.format(person)
'this person is {!s}'.format(person)
'this person is {!a}'.format('皮特')# result
"this person is Person('peter', 25)"
'this person is (peter, 25)'
"this person is '\\u76ae\\u7279'"

python中一些特殊方法的作用相关推荐

  1. python中seed的用法什么作用_Python中的seed()方法怎么用

    Python中的seed()方法怎么用?下面是seed()方法的相关介绍: 描述 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数. 语法 以下是 seed() 方法 ...

  2. python中函数和方法的区别

    本篇内容主要介绍从几个维度来介绍下python中函数和方法的区别: 首先,从分类的角度来分析. (1)函数的分类: 内置函数:python内嵌的一些函数. 匿名函数:一行代码实现一个函数功能. 递归函 ...

  3. python深度讲解_《深度剖析CPython解释器》21. Python类机制的深度解析(第五部分): 全方位介绍Python中的魔法方法,一网打尽...

    楔子 下面我们来看一下Python中的魔法方法,我们知道Python将操作符都抽象成了一个魔法方法(magic method),实例对象进行操作时,实际上会调用魔法方法.也正因为如此,numpy才得以 ...

  4. python中pylint使用方法(pylint代码检查)

    一.Pylint 是什么 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. Pylint 是一个 Python 工具,除 ...

  5. python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法

    python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录

  6. python 中if __name__ = '__main__' 的作用

    python 中if __name__ = '__main__' 的作用 前言 首先我们要知道在python里面万物皆对象,模块也是对象,并且所有的模块都有一个内置属性 __name__. 一个模块的 ...

  7. python的用途实例-python中pass语句意义与作用(实例分析)

    想必大家都是刚刚才开始接触python这门语言的,今天这篇文章就来带大家来了解一下python这门语言之中常常会用到的一个语句pass语句.想必大家都很好奇python中pass作用是什么,接下来我就 ...

  8. python使用方法-在Python中使用next()方法操作文件的教程

    next()方法当一个文件被用作迭代器,典型例子是在一个循环中被使用,next()方法被反复调用.此方法返回下一个输入行,或引发StopIteration异常EOF时被命中. 与其它文件的方法,如Re ...

  9. python中range 10 0_如何在python中使用range方法

    如何在python中使用range方法 发布时间:2021-01-05 16:55:23 来源:亿速云 阅读:94 作者:Leah 如何在python中使用range方法?很多新手对此不是很清楚,为了 ...

最新文章

  1. PHP数据库操作分页类
  2. 论面向组合子程序设计方法 之 燃烧的荆棘
  3. virtual server2005下创建citrix集群的一点记录
  4. DM 源码阅读系列文章(四)dump/load 全量同步的实现
  5. 【渝粤教育】国家开放大学2018年秋季 3722-22T燃气输配工程 参考试题
  6. 1 Vue的基础语法
  7. cs 5 下载地址 、视频教程、安装教程
  8. 如何将手机哔哩哔哩缓存的m4s格式的视频转换成mp4呢?
  9. 计算机进pe按键,台式机进入pe按什么键
  10. Tiny6410+K9GAG08U0E
  11. JavaScript验证身份证号码(15位/18位)
  12. 010Java知识点小结--抽象类、接口
  13. elk学习中遇到的一些问题
  14. 【HTML】Canvas(3)-绘制图片
  15. 关于更换固态硬盘的一些经历...
  16. 驱动辅助资料(工具,目录,指令,debug经验)
  17. Java培训机构出来好找工作吗?
  18. c/c++排坑(3) -- c/c++中的switch语句
  19. Greenplum学习实践-【安装部署】-2、 5.10集群部署
  20. 杰理之升级复位可以选择软复位跳转和绝对地址跳转【篇】

热门文章

  1. 开源视觉salm算法介绍
  2. python语言学习零基础教学视频_Python告白小白视频教程(零基础入门)
  3. oracle 导入excel时间格式,将.xls或者.excel格式的数据导入到Oracle中
  4. easy-ui的datagrid
  5. TOJ5398: 签到大富翁(简单模拟) and TOJ 5395: 大于中值的边界元素(数组的应用)...
  6. python 流程控制if判断
  7. Delphi面向对象学习随笔七:COM
  8. Install OpenStack Kilo Dashboard wiht Nginx + uWSGI On RHEL7.1
  9. VS 2008 生成操作中各个选项的差别
  10. WINDOWS下的squid