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