不弃_ 发表于 2022-3-5 14:22:44

__str__与__repr__的区别是什么

class A:
    def __str__(self):
      return "ji是帅哥"

class B:
    def __repr__(self):
      return "ji是帅哥!"


b = B()
b
print(b)

a = A()
print(a)

python爱好者. 发表于 2022-3-5 14:30:22

__str__ 魔法方法是会在访问其类对象时就会自动执行,
所以只需要:
a = A()
a
返回结果:
"ji是帅哥"
而 __repr__ 魔法方法是会在对这个类生成的实例对象进行打印操作时就会自动执行,
所以只需要:
b = B()
print(b)
返回结果:
"ji是帅哥"

jackz007 发表于 2022-3-5 14:34:35

>>> class A:
    def __str__(self):
      return "ji是帅哥"

>>> class B:
    def __repr__(self):
      return "ji是帅哥!"

>>> a=A()
>>> b=B()
>>> a
<__main__.A object at 0x01793810>
>>> b
ji是帅哥!
>>>

python爱好者. 发表于 2022-3-5 14:35:32

jackz007 发表于 2022-3-5 14:34


抄书?

jackz007 发表于 2022-3-5 14:37:49

python爱好者. 发表于 2022-3-5 14:35
抄书?

      差不多,抄网!{:5_109:}

python爱好者. 发表于 2022-3-5 14:39:06

jackz007 发表于 2022-3-5 14:37
差不多,抄网!

就改了下格式。。。{:10_256:}

不弃_ 发表于 2022-3-5 15:18:04

python爱好者. 发表于 2022-3-5 14:30
__str__ 魔法方法是会在访问其类对象时就会自动执行,
所以只需要:



为什么我的a与b不调用print就不会返回那

傻眼貓咪 发表于 2022-3-5 15:22:02

"""
The repr() function returns the string representation of the value passed to eval function by default.
For the custom class object, it returns a string enclosed in angle brackets that contains the name and address of the object by default.
"""

# 范例:

class A: pass # 类
B = lambda x: x*x*x # 函数
x = 123 # 整数
y = "456" # 字符串

a = str(x) # 将整数变成字符串
b = repr(x) # 以字符串形式,返回对象 x,如上,无差别
c = repr(y) # 以字符串形式,返回字符串(如:字符串 repr("banana") = "\'banana\'")
d = repr(A) # 以字符串形式,返回对象类型
e = repr(B) # 以字符串形式,返回内存地址
f = eval(y) # 去引号

print(a, b, c, d, e, f, sep = "\n")
print()
print(type(a), type(b), type(b), type(d), type(e), type(f), sep = "\n")123
123
'456'
<class '__main__.A'>
<function <lambda> at 0x0000023145BC3E20>
456

<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'int'>

傻眼貓咪 发表于 2022-3-5 15:26:11

本帖最后由 傻眼貓咪 于 2022-3-5 16:23 编辑

repr(): 其实是 evaluatable string representation of an object 的缩写。意思是对象的可评估字符串表示

isdkz 发表于 2022-3-5 15:29:01

本帖最后由 isdkz 于 2022-3-5 15:35 编辑

不弃_ 发表于 2022-3-5 15:18
为什么我的a与b不调用print就不会返回那

__str__ 和 __repr__ 都是返回字符串,

在用 print() 和 str() 的时候 实际上调用的是 对象的 __str__ 方法,

而在控制台直接访问这个变量或者使用repr() 实际上调用了 对象的 __repr__方法

print() 你可以通过格式化字符串改变输出方式:

class A:
    def __str__(self):
      return "ji是帅哥"
    def __repr__(self):
      return "ji是美女"


a = A()

print(a)
print("%s" % a)    # 相当于 print(a)
print("输出原始字符串:%r" % a)    # 输出原始字符串

不弃_ 发表于 2022-3-5 17:03:03

isdkz 发表于 2022-3-5 15:29
__str__ 和 __repr__ 都是返回字符串,

在用 print() 和 str() 的时候 实际上调用的是 对象的 __str ...

所亿方法的区别在哪里呢?

沮授 发表于 2022-3-5 17:34:21

__str__返回的结果是在print的时候出现的
__repr__返回的结果是在交互模式下出现的{:10_245:}

沮授 发表于 2022-3-5 17:34:52

isdkz 发表于 2022-3-5 15:29
__str__ 和 __repr__ 都是返回字符串,

在用 print() 和 str() 的时候 实际上调用的是 对象的 __str ...

hi,猫咪

Stubborn 发表于 2022-3-5 18:46:07

简单的说,一个给机器看,一个给人看{:10_277:}

isdkz 发表于 2022-3-6 14:24:31

不弃_ 发表于 2022-3-5 17:03
所亿方法的区别在哪里呢?

这么说吧,字符串中__str__ 返回的字符串是转义后的,且不带引号的,只是给你看的,在 python 代码中不能直接使用,

而字符串的 __repr__ 返回的字符串是转义前的,且带引号的字面量,可以直接在 python 代码中使用,

而对于其它对象 __repr__ 和 __str__ 的返回值并无区别。所以你并不用纠结这个。

isdkz 发表于 2022-3-6 14:25:03

沮授 发表于 2022-3-5 17:34
hi,猫咪

hi,kfc

不弃_ 发表于 2022-3-6 14:27:24

isdkz 发表于 2022-3-6 14:24
这么说吧,字符串中__str__ 返回的字符串是转义后的,且不带引号的,只是给你看的,在 python 代码中不能 ...

谢了兄弟

isdkz 发表于 2022-3-6 14:29:18

不弃_ 发表于 2022-3-6 14:27
谢了兄弟

不客气{:5_109:}
页: [1]
查看完整版本: __str__与__repr__的区别是什么