gpt4 book ai didi

python - 为什么类方法名的前缀是类名,而不是其他对象?

转载 作者:太空宇宙 更新时间:2023-11-04 01:46:23 28 4
gpt4 key购买 nike

在Python中,如果我定义一个简单的类如下:

>>> class myClass:
... z = zip('abc', (97, 98, 99))
... def meth(self):
... print(self)
...
>>>

然后在提示符处输入以下内容:

>>> myClass.meth
<function myClass.meth at 0x00639540>
>>> myClass.z
<zip object at 0x006432B0>
>>>

我发现函数对象由 Python 表示为属于类 (myClass.meth),但属性的字符串表示不是(它的名称前面没有 myClass。 ) 并且与在类外定义没有什么不同。这是什么原因?

最佳答案

这似乎是在 class 语句中定义函数的副作用。在全局范围内定义方法并显式调用 type 不会将类名添加到函数名中。

考虑以下代码:

class myClass:
def meth(self):
print(self)
print("meth:", repr(meth))
x = lambda self: print(self)
print("x:", repr(x))


def mymeth(self):
print(self)

print("mymeth:", repr(mymeth))
C = type('C', (object,), {'mymeth': mymeth})
print("mymeth:", repr(C.mymeth))

输出是

meth: <function myClass.meth at 0x1055c6b90>
x: <function myClass.<lambda> at 0x1055c6dd0>
mymeth: <function mymeth at 0x1055c6b00>
mymeth: <function mymeth at 0x1055c6b00>

注意事项:

  1. 在 class 语句中,类名被添加到函数名中,无论您使用 def 还是 lambda 表达式。这表示该行为不是 def 语句的一部分。此外,此输出是在 class 对象本身实际创建之前生成的。

  2. 在 class 语句之外,对 type 的调用不会将类名添加到函数名中。这表明修改函数名称的是 class 语句本身,而不是创建类的行为。


至于为什么会这样?据推测,决定在 function.__repr__ 的输出中添加一个“完全限定”的方法名称以用于调试目的是有用的,但我只是推测。

关于python - 为什么类方法名的前缀是类名,而不是其他对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59015552/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com