[英]Function is an object of class in python?
我讀到一個函數是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'>
type'type <type 'type'>
。請更正我的理解。
它是,但沒有內置的名稱。 你可以在types
模塊下找到另一個參考:
>>> import types
>>> def T1():
... print 'test'
...
>>> T1.__class__ is types.FunctionType
True
>>> print repr(types.FunctionType)
<type 'function'>
因此,您唯一注意到的是function
不是內置名稱,與int
, type
等名稱不同。
這樣想吧。 假設您創建自己的元類(類的類),以及元類的子類(它本身只是一個類):
>>> 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
名稱(它本身就像一個內置的元類;即,它是函數對象的類或類型) - 默認情況下, 名稱 function
在交互式Python會話中不存在。 但該對象仍然存在。 你可以這樣訪問它:
>>> def f(): pass
>>> f.__class__.__class__
<class 'type'>
如果你願意,你甚至可以繼續將名稱function
分配給函數<class 'type'>
object(盡管沒有太多理由這樣做):
>>> function = f.__class__
>>> print(function)
<class 'function'>
>>> print(function.__class__)
<class 'type'>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.