2015-09-27 49 views
2

我有下面的類被傳遞:Python的進口類的實例化對象

classes/helper.py

import json 

class Helper: 
    def uJSONEncode(_, dict): 
     print(type(_)) 
     return json.dumps(dict).decode('unicode-escape') 

我實例化類,如下所示:

Python 2.7.9 (default, Feb 10 2015, 03:28:08) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from classes.helper import Helper 
>>> h = Helper() 
>>> h.uJSONEncode({"Asd": "asd"}) 
<type 'instance'> 
\u'{"Asd": "asd"}' 

爲什麼蟒通(我假設是)實例化對象作爲第一個參數?我將如何避免這種行爲?

+2

如果你不需要它是一種方法,那麼[不要使它成爲一種方法](http://dirtsimple.org/2004/12/python-is-not-java.html)。 –

+0

爲什麼你創建的課程,如果它不會保持任何狀態? – BrenBarn

+0

我使用了一個類,因爲我不想污染全球範圍。那麼我在這種情況下如何命名空間函數呢? – Carey

回答

1

你不需要一個類來編寫一個函數。只是這樣做:

def uJSONEncode(mydict): 
    return json.dumps(mydict).decode('unicode-escape') 

然後可以導入包含此功能的模塊,並使用它作爲正常。除非類實際上要做某些事情(如存儲持久狀態),否則將其包裝在類中是沒有用的。

1

你可能想創建一個靜態方法:

class Helper: 
    @staticmethod 
    def uJSONEncode(dict): 
     print(type(_)) 
     return json.dumps(dict).decode('unicode-escape') 

,然後調用它像這樣:

Helper.uJSONEncode({"Asd": "asd"}) 
1

正如其他人所說,你可能需要一個類在這裏:只需將該功能作爲獨立功能放入您的模塊即可。與其他語言(例如Java)不同,Python不會強迫你將類包裝到類中。即使你有幾個相關的功能,你可能不需要一個類,除非這些功能需要共享狀態。簡單地將相關的功能放到一個模塊中就是足夠的封裝。


在Python,正常類方法接收該實例作爲第一個參數。而且它的正常使用self對於這樣的說法,所以你會寫像

def uJSONEncode(self, dct): 


方法簽名在Python 2,你應該從object派生類,以便他們new-style classes,否則你得到一個老式的課程,這有一些限制。例如,

class Helper(object): 

在Python 3類自動繼承object,所以你可以使用你在你的問題中使用的語法,但它仍然推薦使用顯式object語法。

這裏使用新式類的一個次要的好處是,該實例的類型的默認表示(即,它的類)多一點信息:

import json 

class Helper(object): 
    def uJSONEncode(self, dct): 
     print(type(self)) 
     return json.dumps(dct).decode('unicode-escape') 

h = Helper() 
print(h.uJSONEncode({"Asd": "asd"})) 

輸出

<class '__main__.Helper'> 
{"Asd": "asd"} 


BTW,不要使用dict作爲變量名,因爲這陰影內置dict類型,這可能導致神祕的&煩人的錯誤。 liststr,int,floatset等也是如此。


最後,_在交互式解釋特殊的意義:這是最後的結果。演示:

>>> 3+7 
10 
>>> _ 
10