我读到一个函数是python中一个类的对象。为了进一步理解,我在下面做了:
>>> a=10
>>> a.__class__
<type 'int'>
>>> int.__class__
<type 'type'>
>>>
>>>
>>> def T1():
... print 'test'
...
>>> T1.__class__
<type 'function'>
>>> function.__class__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'function' is not defined
问:为什么解释器会在第二种情况下抛出错误,而不是在第一种情况下?我期待它返回<type 'type'>
。请纠正我的理解。
答案 0 :(得分:2)
确实如此,但没有内置名称。您可以在types
模块下找到另一个参考:
>>> import types
>>> def T1():
... print 'test'
...
>>> T1.__class__ is types.FunctionType
True
>>> print repr(types.FunctionType)
<type 'function'>
因此,您唯一注意到的是function
不是内置名称,与int
,type
等名称不同。
答案 1 :(得分:0)
这样想。假设您创建自己的元类(类的类),以及元类的子类(它本身只是一个类):
>>> class MyMeta(type): # <-- a custom metaclass, similar to function
pass
>>> print(MyMeta.__name__)
MyMeta
>>> print(__class__)
<class 'type'>
>>> class MyClass(metaclass = MyMeta):
pass
>>> print(MyClass.__class__)
<class 'MyMeta'>
现在,我们将删除标识符MyMeta
:
>>> del MyMeta
虽然MyMeta
已被删除,您仍然可以访问由MyMeta
表示的元类对象吗?肯定的是:
>>> print(MyClass.__class__)
<class 'MyMeta'>
因此,MyClass
dict中仍然存在对元类对象的引用。
但是, 名称 MyMeta
现在无效,因为它已被删除:
>>> class MyClassTwo(metaclass = MyMeta):
pass
NameError!!
>>> print(MyMeta.__name__)
NameError!!
>>> print(MyMeta)
NameError!!
重要提示:已删除元类 名称 ,而不是元类对象本身。
因此您仍然可以通过以下方式访问元类 对象 :
>>> class MyClassTwo(metaclass = MyClass.__class__):
pass
所以它是function
名称(它本身就像一个内置的元类;即,它是函数对象的类或类型) - 默认情况下, <交互式Python会话中不存在em> name function
。但 对象 仍然存在。你可以这样访问它:
>>> def f(): pass
>>> f.__class__.__class__
<class 'type'>
如果您愿意,您甚至可以继续将名称function
分配给函数<class 'type'>
对象(尽管没有太多理由这样做):
>>> function = f.__class__
>>> print(function)
<class 'function'>
>>> print(function.__class__)
<class 'type'>