在python中。當我寫x = 5
時,x
自動成爲int
的實例。但假設我已經定義了一個新類,說number
,並且我想要x
成爲number
的一個實例,而不是int
,當我將它分配給值5
時。這可能嗎?Python自動類分配
即,取而代之的是 - >
>>> x = 5
>>> type(x)
<type 'int'>
這是可能的:
>>> x = 5
>>> type(x)
<type 'number'>
在python中。當我寫x = 5
時,x
自動成爲int
的實例。但假設我已經定義了一個新類,說number
,並且我想要x
成爲number
的一個實例,而不是int
,當我將它分配給值5
時。這可能嗎?Python自動類分配
即,取而代之的是 - >
>>> x = 5
>>> type(x)
<type 'int'>
這是可能的:
>>> x = 5
>>> type(x)
<type 'number'>
請注意,你真的不應該這樣做。 Jakob有正確的答案,即使用x = number(5)
。
但是,這麼說,我想嘗試如何才能在理論上可以做到,這裏是在一個裝飾形式的一個解決方案:
import types
class number(object):
def __init__(self, value):
self.value = value
def replace_int(x):
if isinstance(x, int):
return number(x)
else:
return x
def custom_numbers(f):
code = f.func_code
consts = tuple(map(replace_int, code.co_consts))
new_code = types.CodeType(code.co_argcount, code.co_nlocals,
code.co_stacksize, code.co_flags,
code.co_code, consts, code.co_names,
code.co_varnames, code.co_filename,
code.co_name, code.co_firstlineno,
code.co_lnotab)
return types.FunctionType(new_code, f.func_globals, f.func_name)
你裝飾的任何功能,最終會使用自定義數類:
@custom_numbers
def test():
x = 5
print type(x)
>>> test()
<class '__main__.number'>
的裝飾機的工作原理是使用自定義類的實例,從函數的代碼對象替換整型常量。但是,因爲function.co_code
和code.co_consts
都是隻讀屬性,所以我們必須創建具有更改值的新代碼和函數對象。
一個警告是,值被假定爲常量,所以不會爲每個函數的調用創建新的實例。如果您改變該值,則該新值將在該函數的每個後續調用中反映出來。
號你將不得不寫猴子補丁來實現這一目標,這是令人難以置信的unpythonic,可以你根本不會寫
x = number(5)
:)
確實可以通過編寫`x = number(5)`來簡單地實現它,但是我的程序要求是我希望前者發生。反正,正在製作/使用那個簡單或複雜的猴子補丁? – 2011-02-16 10:39:44
你基本上不得不重寫Python的後端^^ – 2011-02-16 10:41:52
您將不得不利用Python's language services來編譯語句,然後根據需要走AST替換對象。
實際上,5
是int
,x
的實例就是指向它。 Python中的所有變量都是對象的引用。因此,當您編寫type(x)
時,您會得到x
保留對的引用的對象的類型,在這種情況下,它是int
。
如果分配另一個值x
,說x = "string"
,x
將持有該字符串對象的引用,並type(x)
將返回<type 'str'>
。
是的,我們已經很清楚這一點了,這點已經是相對的了。 – 2011-02-16 11:12:32
不可以。不可以。重要的問題是「你爲什麼想要這樣做?」和「你的真實**問題是什麼?」你想做什麼?你有什麼問題?這怎麼可能成爲解決這個問題的辦法?請爲此提供背景。 – 2011-02-16 11:07:24