看一看str和repr原理以及两个类的魔术方法

「这是我参与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类

Guess you like

Origin juejin.im/post/7032654534799753224