2011-02-16 72 views
1

在python中。當我寫x = 5時,x自動成爲int的實例。但假設我已經定義了一個新類,說number,並且我想要x成爲number的一個實例,而不是int,當我將它分配給值5時。這可能嗎?Python自動類分配

即,取而代之的是 - >

>>> x = 5 
>>> type(x) 
<type 'int'> 

這是可能的:

>>> x = 5 
>>> type(x) 
<type 'number'> 
+0

不可以。不可以。重要的問題是「你爲什麼想要這樣做?」和「你的真實**問題是什麼?」你想做什麼?你有什麼問題?這怎麼可能成爲解決這個問題的辦法?請爲此提供背景。 – 2011-02-16 11:07:24

回答

4

請注意,你真的不應該這樣做。 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_codecode.co_consts都是隻讀屬性,所以我們必須創建具有更改值的新代碼和函數對象。

一個警告是,值被假定爲常量,所以不會爲每個函數的調用創建新的實例。如果您改變該值,則該新值將在該函數的每個後續調用中反映出來。

5

號你將不得不寫猴子補丁來實現這一目標,這是令人難以置信的unpythonic,可以你根本不會寫

x = number(5) 

:)

+0

確實可以通過編寫`x = number(5)`來簡單地實現它,但是我的程序要求是我希望前者發生。反正,正在製作/使用那個簡單或複雜的猴子補丁? – 2011-02-16 10:39:44

+0

你基本上不得不重寫Python的後端^^ – 2011-02-16 10:41:52

1

實際上,5int,x的實例就是指向它。 Python中的所有變量都是對象的引用。因此,當您編寫type(x)時,您會得到x保留對的引用的對象的類型,在這種情況下,它是int

如果分配另一個值x,說x = "string"x將持有該字符串對象的引用,並type(x)將返回<type 'str'>

+1

是的,我們已經很清楚這一點了,這點已經是相對的了。 – 2011-02-16 11:12:32