zoukankan      html  css  js  c++  java
  • python3--__repr_和__str__会返回字符串表达形式

    __repr_和__str__会返回字符串表达形式

    下一个例子是已经见过的init构造方法和add重载方法,本例也会定义返回实例的字符串表达形式的__repr__方法。字符串格式把self.data对象转换为字符串。如果定义了的话,当类的实例打印或转换成字符申时,__repr__(或其近亲__str__)就会自动调用。这些方法可替对象定义更好的显示格式,而不是使用默认的实例显示。

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    class adder:
        def __init__(self, value = 0):
            self.data = value
        def __add__(self, other):
            self.data += other
    
    class addrepr(adder):
        def __repr__(self):
            return 'addrepr(%s)' % self.data
    
    x = addrepr(2)
    x + 1
    print(x)
    
    print(str(x), repr(x))
    

    运行结果:

    addrepr(3)
    addrepr(3) addrepr(3)
    

    那么,为什么要两个显示方法?概括地讲,是为了进行用户有好的显示,就像print语句和str内置函数一样,会先尝试__str__。__repr__方法从原则上应该放回一个字符串,这个字符串可以作为可执行代码去重建该对象,这是用于交互模式下提示回应以及repr函数。如果__str__不存在,Python会转向__repr__(反过来就不会)。

    class addstr(adder):
        def __str__(self):
            return '[Value: %s]' % self.data
    
    x = addstr(3)
    x + 1
    print(x)
    print(str(x), repr(x))
    

    运行结果:

    [Value: 4]
    [Value: 4] <__main__.addstr object at 0x000000000280A2E8>
    

    正是由干这一点,如果想让所有环境都有统一的显示,__repr__是最佳选择。不过,分别定义这两个方法的话,就可在不同环境内支持不同显示。例如,终端用户显示使用__str__,而程序员在开发期间则使用底层的__repr__来显示。

    class addboth(adder):
        def __str__(self):
            return '[Value: %s]' % self.data
        def __repr__(self):
            return 'addboth(%s)' % self.data
    
    x = addboth(4)
    x + 1
    print(x)
    print(str(x), repr(x))
    

    运行结果:

    [Value: 5]
    [Value: 5] addboth(5)

    在实际应用中,除了__init__以外,__str__(或其底层的近亲__repr__)似乎是Python脚本中第二个最常用的运算符重载方法。在任何时候,都可以打印对象而看见定制过的显示的时候,可能就是使用了这两个工具中的一个。

  • 相关阅读:
    hdu 4339 Query 一道挺好的树状数组题(树状数组+二分思想)
    hdu 1133 Buy the Ticket(递推+精度精算)
    hdu 1267 下沙的沙子有几粒?(二维递推题)
    hdu 3397 Sequence operation(线段树的延迟标记)
    hdu 1258(dfs)
    hdu 3911 Black And White(线段树的延迟标记法)
    hdu 4148 Length of S(n) (坑爹的规律题)
    hdu 1016(一道经典的dfs)
    如何建立一棵哈夫曼树并且输出压缩码
    Codeforces Round #588 (Div. 2) E. Kamil and Making a Stream(DFS)
  • 原文地址:https://www.cnblogs.com/chenlin163/p/7306292.html
Copyright © 2011-2022 走看看