「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」
在交互模式下输出的交互信息与直接print的信息有些不同,背后的原理是 ?
str和repr原理:
return返回的必须是字符串。
print打印实例对象的时候(没有重写__repr__方法,直接是pass)显示的是 地址
如果重写了__repr__方法,那么打印的就是__repr__方法里面的东西
如果同时重写了__repr__和__str__方法,打印实例对象的时候,只会显示__str__里面的内容
例一:::
1 | ruby复制代码class Person: |
%s 使用的是__str__方法; %r 使用的是__repr__方法
例二:::
1 | python复制代码class Person: |
在python中,str和repr方法在处理对象的时候,分别调用的是对象的__str__和__repr__方法
print打印对象,调用str函数,如果对象没有定义__str__方法,则调用__repr__方法处理
在交互模式下,直接输出对象,显示 repr 的返回值
魔术方法 def call(self)
正常情况下,实例是不能像函数一样被调用的,要想实例能够被调用,就需要定义 call 方法
1 | ruby复制代码class Person: |
拓展:
类中的一些查询相关信息的方法(了解既可)
1、class 查看类名
1 | markdown复制代码格式: 实例.__class__ |
2、dict 查看全部属性,返回属性和属性值键值对形式
1 | markdown复制代码格式:实例.__dict__ |
3、doc 查看对象文档,即类中(用三个引号引起来的部分)
1 | markdown复制代码格式:类名.__dict__ |
4、bases 查看父类
1 | markdown复制代码格式:类名.__base__ |
5.mro 查看多继承的情况下,子类调用父类方法时,搜索顺序
1 | markdown复制代码格式:子类名.__mro__ |
再来个魔术方法
类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做呢?
__new__方法
举个例子:::
1 | python复制代码class Person: |
四个点理解__new__方法:
1、__new__方法是在类创建实例的时候
自动调用的。
2、实例是通过类里面的__new__方法是在
类 创建出来的。
3、先调用__new__方法创建实例,再调用 __init__方法初始化实例。
4、__new__方法,后面括号里的cls代表
的是类本身
在上面的例子中,我们可以看到创建实例的时候,自动调用了__new__,方法和__init__方法,并且
是先调用的__new__(__new__方法会在内存当中开辟一个空间)再调用的__init__方法,打印 cls 的时候显示的这个Person类
本文转载自: 掘金