看一看str和repr原理以及两个类的魔术方法 在交互模式下

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

在交互模式下输出的交互信息与直接print的信息有些不同,背后的原理是 ?

str和repr原理:

return返回的必须是字符串。

print打印实例对象的时候(没有重写__repr__方法,直接是pass)显示的是 地址

如果重写了__repr__方法,那么打印的就是__repr__方法里面的东西

如果同时重写了__repr__和__str__方法,打印实例对象的时候,只会显示__str__里面的内容

例一:::

1
2
3
4
5
6
7
8
9
10
ruby复制代码class Person:

def __repr__(self):
return '这是一个repr方法'

def __str__(self):
return '这是一个str方法'

p = Person()
print(p) 输出为: 这是一个str方法

%s 使用的是__str__方法; %r 使用的是__repr__方法

例二:::

1
2
3
4
5
6
7
8
9
10
11
python复制代码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 方法

1
2
3
4
5
6
7
8
9
10
11
ruby复制代码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 查看类名

1
markdown复制代码格式:  实例.__class__

2、dict 查看全部属性,返回属性和属性值键值对形式

1
markdown复制代码格式:实例.__dict__

3、doc 查看对象文档,即类中(用三个引号引起来的部分)

1
markdown复制代码格式:类名.__dict__

4、bases 查看父类

1
markdown复制代码格式:类名.__base__

5.mro 查看多继承的情况下,子类调用父类方法时,搜索顺序

1
2
3
markdown复制代码格式:子类名.__mro__

实例.__class__.__mro__

再来个魔术方法

类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做呢?

__new__方法

举个例子:::

1
2
3
4
5
6
7
8
9
10
11
12
13
14
python复制代码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类

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%