在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)。),与在类外定义没有区别。原因是什么?你知道吗
z
只是一个名称,它持有的值是内置的zip
类,它不是myClass
的一部分。你知道吗这似乎是在
class
语句中定义函数的副作用。在全局范围定义方法并显式调用type
不会将类名添加到函数名中。你知道吗考虑以下代码:
谁的输出是
注意事项:
在class语句中,无论使用
def
还是lambda表达式,都会将类名添加到函数名中。这表示该行为不是def
语句的一部分。而且,这个输出是在实际创建class
对象之前产生的。在class语句之外,对
type
的调用不会将类名添加到函数名中。这表明修改函数名的是class
语句本身,而不是创建类的行为。至于为什么会这样?据推测,出于调试目的,在
function.__repr__
的输出中添加一个“完全限定的”方法名是有用的,但我只是猜测。你知道吗这是因为通过调用
myclass.meth
,您只需指向函数所在的内存位置。你知道吗但是对于
myClass.z
,您只是调用z
返回的内容。 类似于:那么
myClass.x
就是2
SIDENOTE:在代码片段中,
z
是myClass
的一部分。为了简单起见,它与在构造函数中定义self.z = zip('abc', (97, 98, 99))
相同。 为了弄清楚为什么如果我真的不喜欢那样做,我会查一下 Class vs Instance attributes添加示例:
再加上另一个可能对这个问题有所启发的例子,考虑一下
那么
而不是
相关问题 更多 >
编程相关推荐