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:“模块”对象没有属性“generateChars”。两个文件夹位于同一级别。我导入类文件的方式或静态方法声明本身是否有问题?

4

2 回答 2

9

Python 不是 Java。

首先,Tester 或 Password 类绝对没有意义。如果您不存储状态,则不要定义类。使两者都whatever成为generateChars正常的独立功能。

但是,假设您这样做只是为了了解 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 回答