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

2024-04-27 21:01:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在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)。),与在类外定义没有区别。原因是什么?你知道吗


Tags: 对象方法函数self定义objectdefmyclass
3条回答

z只是一个名称,它持有的值是内置的zip类,它不是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__的输出中添加一个“完全限定的”方法名是有用的,但我只是猜测。你知道吗

这是因为通过调用myclass.meth,您只需指向函数所在的内存位置。你知道吗

但是对于myClass.z,您只是调用z返回的内容。 类似于:

class myClass:
    x = 2
    z = zip('abc', (97, 98, 99))
    ...

那么myClass.x就是2

SIDENOTE:在代码片段中,zmyClass的一部分。为了简单起见,它与在构造函数中定义self.z = zip('abc', (97, 98, 99))相同。 为了弄清楚为什么如果我真的不喜欢那样做,我会查一下 Class vs Instance attributes

添加示例:
再加上另一个可能对这个问题有所启发的例子,考虑一下

def some_fn():
   return 'hello world'

class A(object):
   p = some_fn

那么

A.p
>> <function some_fn at 0x7f00fefbef80>

而不是

>>> <function A.some_fn at ... >

相关问题 更多 >