2013-04-26 87 views
1

當傳遞一個參數時,type函數如何確定它傳遞的對象的類型?類型函數如何確定對象的類型?

是否可以通過對對象的class定義進行一些特定更改來定製它的返回值?

編輯:

我懷疑它採用了object.__class__屬性,因爲儘管覆蓋類的__getattribute__功能查詢__class__時返回一些任意值,它返回的實際類型時類型通過type檢查的。

>>> class Foo(object): 
...  def __getattribute__(self, name): 
...   if name == "__class__": 
...    return type("Bar",(), {}) 
...   else: 
...    return super(Foo, self).__getattribute__(name) 
... 
>>> bar = Foo() 
>>> bar.__class__ , type(bar) 
(<class '__main__.Bar'>, <class '__main__.Foo'>) 

回答

2

這是一個實現細節,但我會假設它通過檢查值的內部表示中的一些數據來做到這一點。

畢竟,Python系統必須能夠確定每個值的類型,以便弄清楚如何對它們執行操作。

The documentation沒有提及任何修改或影響type()內置函數返回的值的方法,所以我認爲你不能這樣做。

0

類實例有一個叫做__class__的特殊屬性。

In [1]: class A: 
    ...:  pass 
    ...: 

In [2]: class B: 
    ...:  pass 
    ...: 

In [3]: a = A() 

In [4]: type(a), a.__class__ 
Out[4]: (__main__.A, __main__.A) 

In [5]: a.__class__ = B 

In [6]: type(a), a.__class__ 
Out[6]: (__main__.B, __main__.B) 

在Python 2.x中,您需要新樣式的類來查看此輸出。否則:

In [4]: type(a), a.__class__ 
Out[4]: (instance, __main__.A) 

In [5]: a.__class__ = B 

In [6]: type(a), a.__class__ 
Out[6]: (instance, __main__.B) 
0

From the docs

每個值是一個對象,並且因此具有類(也稱爲其類型)。它被存儲爲object.__class__

1

類型將詳細介紹什麼是在屬性,這是一個參考其中對象是一個實例:

>>> num = 5 
>>> num.__class__ 
<class 'int'> 
>>> type(num) 
<class 'int'> 
>>> type(type(num)) 
<class 'type'> 

這與元類有關,metaclasses是一個明智的答案這些是他們如何工作可以在這裏找到What is a metaclass in Python Alternativley,這是指導是非常徹底的Python types and Objects