函数是python中的类的对象?

时间:2017-01-30 18:11:39

标签: python function

我读到一个函数是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'>。请纠正我的理解。

2 个答案:

答案 0 :(得分:2)

确实如此,但没有内置名称。您可以在types模块下找到另一个参考:

>>> import types
>>> def T1():
...     print 'test'
...     
>>> T1.__class__ is types.FunctionType
True
>>> print repr(types.FunctionType)
<type 'function'>

因此,您唯一注意到的是function不是内置名称,与inttype等名称不同。

答案 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'>