簡體   English   中英

函數是python中的類的對象?

[英]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不是內置名稱,與inttype等名稱不同。

這樣想吧。 假設您創建自己的元類(類的類),以及元類的子類(它本身只是一個類):

>>> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM