zoukankan      html  css  js  c++  java
  • Python:__str__() 和 __repr__()

    #最近在根据廖雪峰老师的python学习教程学习,以下是学习过程中做的一些学习总结

    1、__str__()和 __repr__()的作用

      当我们定义一个类时,进行打印一个实例,通常打印出来的都是一堆类名+继承类+内存地址,显示的非常不友好。

    class Student(object):
        def __init__(self,name):
            self.name =name
    
    >>>A = Student('lisa')
    >>>print(A)
    <__main__.Student object at 0x000001A69C01F198>

      怎样才能打印的友好一些,让我们看结果更加直观一点,这个时候就用到了__str__方法:

    class Student(object):
        def __init__(self,name):
            self.name = name
        def __str__(self):
               return self.name
    >>>A = Student('lisa')
    >>>print(A)
    lisa

      现在我们再次观看结果就非常的直观,直接显示出了实例内部的重要数据,但是细心的同学会发现我们不用print直接打印变量显示的结果还是不友好的:

    class Student(object):
        def __init__(self,name):
            self.name = name
        def __str__(self):
               return self.name
    >>>A = Student('lisa')
    >>>A
    <__main__.Student object at 0x00000227DB28F128>

      打印变量还是原来的显示,这就用到了__repr__()方法,我们在代码的方法中添加一个__repr__的方法:

    class Student(object):
        def __init__(self,name):
            self.name = name
        def __str__(self):
            return self.name
        def __repr__(self):
            return self.name

      然后我们再次打印结果:

    >>>A = Student('lisa')
    >>>A
    lisa
    >>>print(A)
    lisa
    >>>print(Student('lisa'))
    lisa

      现在无论是直接输出变量还是打印变量,类方法都能直观的显示结果。

    2、两者的区别

      知道了两者的用法,不知道各位能否发现什么区别,首先两者是相似的,因为在代码中的作用都是为了让结果好看点,更利于让人观看;但是两者之间还是存在一点差别的,在python中,print()是面向用户的,主要是为了用户观看,直接打印变量是为了向管理者展示的:

    >>>A               #面向管理者
    lisa
    >>>print(A)        #面向用户
    lisa

      还有一点,在打印操作时会首先尝试__str__和str的内置函数,二__repr__用于其他环境中,当代码中没有__str__方法也会返回有好的提示,实际上__str__只是覆盖了__repr__的提示。

    class Student(object):
        def __init__(self,name):
            self.name = name
        def __str__(self):
            return '__str__ '+self.name
        def __repr__(self):
            return '__repr__'+self.name
    >>> a = Student('lisa')
    >>> a
    __repr__lisa
    >>> print(a)
    __str__ lisa
  • 相关阅读:
    利用Sentinel实现Redis主从切换
    Docker应用一:docker介绍
    利用RAP搭建可视化接口管理平台
    Lucene初步搜索
    Lucene索引的初步创建
    kettle不能正常自动获取字段
    配置hive元数据库mysql时候出现 Unable to find the JDBC database jar on host : master
    Lost connection to MySQL server at ‘reading initial communication packet', system error: 0 mysql远程连接问题
    Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)解决方法
    Sqoop import加载HBase案例详解
  • 原文地址:https://www.cnblogs.com/twlr/p/12304654.html
Copyright © 2011-2022 走看看