【问题标题】:Correct use of static methods正确使用静态方法
【发布时间】:2012-11-03 17:16:17
【问题描述】:

我在folder1 中有以下名为Password.py 的简化类:

import random                                                                    

CHARS = "ABC"

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

现在我在folder2 有另一个班级TestClass.py

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' object has no attribute 'generateChars'。两个文件夹位于同一级别。我导入类文件的方式或静态方法声明本身是否有问题?

【问题讨论】:

    标签: python static-methods


    【解决方案1】:

    Python 不是 Java。

    首先,Tester 或 Password 类绝对没有意义。如果您不存储状态,则不要定义类。将whatevergenerateChars 都变成普通的独立函数。

    但是,假设您这样做只是为了了解 Python 类,您还没有理解 Python 中的类不等于模块。既然你已经导入了Password 模块,还需要引用PasswordHelper 类:

    Password.PasswordHelper.generateChars(3)
    

    或者,您可以导入 PasswordHelper 类:

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

    最后,请按照 PEP8 为您的模块、类和函数名称。

    【讨论】:

    • +1 注意,即使您有状态,也可以将该状态作为参数传递并返回值。但这是一个品味问题,首先要摆脱“everything 的类”心态。
    • 嗯。好的。我认真地认为,为所有事情上一堂课被认为是好的风格。我想我错了……
    • 其实我在想,为什么对所有东西都有类是不好的?是否有更多“更深入”的解读?
    • @cherrun 你应该阅读Python is not Java,它还会引发其他问题。我个人对所有内容的类的问题是它毫无意义:它只是在图片中添加了另一个没有任何用处的元素,但浪费了屏幕空间、心理容量、需要一个名字(必须记住)等等。 -- 这表明程序员不知道除了 OOP 及其使用之外的范式(或者,更糟糕的是,因为不好/无效的原因而回避它们)。
    【解决方案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 中,函数必须成为类定义的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 2012-04-14
      • 1970-01-01
      • 2019-03-31
      • 2015-05-22
      • 1970-01-01
      • 2011-02-08
      • 2011-02-12
      相关资源
      最近更新 更多