5

Password.py私は次の名前の簡略化されたクラスを持っていますfolder1

import random                                                                    

CHARS = "ABC"

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

今、私は別のクラスを持っていTestClass.pyますfolder2

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:'module'オブジェクトに属性'generateChars'がありません。両方のフォルダは同じレベルにあります。クラスファイルのインポート方法や静的メソッド宣言自体に問題はありますか?

4

2 に答える 2

9

PythonはJavaではありません。

まず、テスタークラスとパスワードクラスのどちらにもまったく意味がありません。状態を保存しない場合は、クラスを定義しないでください。whatevergenerateCharsを通常のスタンドアロン機能にします。

ただし、Pythonクラスについて学習するためだけにこれを行っていると仮定すると、クラスがPythonのモジュールと等しくないことを理解していません。モジュールをインポートしたので、クラスPasswordを参照する必要があります。PasswordHelper

Password.PasswordHelper.generateChars(3)

または、PasswordHelperクラスをインポートすることもできます。

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

最後に、モジュール、クラス、および関数の名前については、PEP8に従ってください。

于 2012-11-03T17:20:32.963 に答える
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では、関数はクラス定義の一部である必要はありません

于 2012-11-03T17:18:18.427 に答える