2012-11-03 73 views
3

我有以下命名Password.py簡化類:正確使用靜態方法

import random                  

CHARS = "ABC" 

class PasswordHelper(object):             
    @staticmethod                   
    def generateChars(length):              
     return ''.join(random.choice(CHARS) for x in range(length)) 

現在我有TestClass.pyfolder2另一個類:

sys.path.append('../folder1/')        
import Password           

class Tester:           
    def whatever(self):         
     print Password.generateChars(3) 

def main(): 
    x = Tester() 
    x.whatever() 

# call main method 
main() 

當調用python TestClass.py我得到以下錯誤: AttributeError:'模塊'對象沒有'generateChars'屬性。兩個文件夾都處於同一級別。我導入類文件或使用靜態方法聲明本身的方式有問題嗎?

回答

8

Python不是Java。

首先,測試者或密碼類別絕對沒有意義。如果你不存儲狀態,那麼不要定義一個類。使whatevergenerateChars成爲正常的獨立功能。

但是,假設你只是爲了瞭解Python類而這樣做,你還沒有理解一個類不等於Python中的一個模塊。既然你已經導入了Password模塊,你仍然需要參考PasswordHelper類:

Password.PasswordHelper.generateChars(3) 

或者,你可以導入PasswordHelper類:

from Password import PasswordHelper 
... 
PasswordHelper.generateChars(3) 

最後,請按照PEP8爲模塊,類和函數名稱。

+0

+1 NB即使你有狀態,它可能有意義的傳遞該狀態作爲參數和返回值。但這是一個有趣的問題,首先擺脫「爲所有*的課程」思想。 – delnan

+0

嗯。好的。我認真考慮過,爲所有事物開設一堂課被認爲是很好的風格。我想我錯了... – cherrun

+0

其實我想知道,爲什麼所有的課都不好?是否有更多「更深」的讀物? – cherrun

2

你定義在類的功能,所以你需要與類名也引用它:

print Password.PasswordHelper.generateChars(3) 

或者,將功能出來的類定義的,在這一點上,你不需要使用@staticmethod都:

import random                  

CHARS = "ABC" 

def generateChars(length):              
    return ''.join(random.choice(CHARS) for x in range(length)) 

在Python,功能不是一個類定義的一部分。

相關問題