正确使用静态方法

che*_*run 5 python static-methods

我有以下命名简化类Password.pyfolder1:

import random                                                                    

CHARS = "ABC"

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

现在我有另一个类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()
Run Code Online (Sandbox Code Playgroud)

调用时python TestClass.py我得到以下错误:AttributeError:'module'对象没有属性'generateChars'.两个文件夹都在同一级别.导入类文件或使用静态方法声明本身的方式有问题吗?

Dan*_*man 9

Python不是Java.

首先,Tester或Password类绝对没有意义.如果您没有存储状态,则不要定义类.制作两者whatevergenerateChars进入正常的独立功能.

但是,假设您只是为了了解Python类,您还没有理解类不等于Python中的模块.由于您已导入Password模块,因此仍需要引用PasswordHelper该类:

Password.PasswordHelper.generateChars(3)
Run Code Online (Sandbox Code Playgroud)

或者,您可以导入PasswordHelper类:

from Password import PasswordHelper
...
PasswordHelper.generateChars(3)
Run Code Online (Sandbox Code Playgroud)

最后,请按照PEP8了解您的模块,类和函数名称.

  • @cherrun你应该阅读[Python is not Java](http://dirtsimple.org/2004/12/python-is-not-java.html),它也引发了其他问题.我个人的问题与班级的一切就是它的纯毫无意义:它只是增加了一个新元素,画面不具有任何用途,但浪费了屏幕空间,心理承受能力,需要一个名称(必须记住),等等. - 它表明程序员不知道OOP旁边的范例及其使用(或者更糟糕的是,由于不良/无效原因而避免它们). (3认同)