如果我没有用于类的__init__方法,应该使用@staticmethod吗?

时间:2019-04-17 03:44:31

标签: python

我正在构建一个菜单系统,其中每个特定的菜单都作为python类实现。但是,这些类不需要__init__函数,给它们一个类会浪费空间,因为我有很多类,每个类都相对较小。这是两个示例:

class CLOCK_TIME_INCREMENT_MENU:
    optionl1 = "Clock increment:" 
    options = [str(x) + " second(s)" for x in range(0, 21, 2)] # Menu options (displayed to user)

    def yes(board): # Called when user presses "yes"
        durations = range(0, 21, 2)
        board.clock_time_increment = durations[board.co] # board.co is the menu option the user selected
        board.start_game()

class USE_CLOCK_MENU:
    optionl1 = None
    options = [["Use clock?", ""]]

    def yes(board):
        board.use_clock = True
        board.menu_stack.append(CLOCK_TIME_MENU) # Add next part of menu to menu stack

    def no(board): # Called when the user presses "no"
        board.use_clock = False
        board.start_game()

然后,我在另一个类(board类)中循环,该循环读取board.menu_stack中的顶级菜单类并显示该类中的选项。当用户单击“是”或“否”按钮时,循环将调用菜单类中的相应方法。

所以我有两个问题:首先,菜单类中的方法是静态方法,所以我应该像往常一样使用@staticmethod装饰器吗?我认为它所做的只是从具有__init__函数的类中的方法的方法调用中删除第一个实例参数,因此我不应该将其用于菜单类方法。我说得对吗?

第二,我使用没有__init__方法的类来构造菜单的方式有什么问题吗?我可以使用更好的数据结构来获得相同的功能吗?

谢谢,如果您需要它们,请要求澄清!

1 个答案:

答案 0 :(得分:1)

它们将具有默认的__init__函数,该函数不执行任何操作:

>>> class Foo:
...     pass
... 
>>> Foo()
<__main__.Foo object at 0x7f5d84b8b828>
>>> Foo().__init__
<method-wrapper '__init__' of Foo object at 0x7f5d84b8b908>
>>> Foo.__init__
<slot wrapper '__init__' of 'object' objects>

您可以使用@staticmethod,因此您无需实例化该类即可使用这些方法(您的类将表现为缺少名称空间)。但是,这样做的Python方式是为每个变量和函数都有一个简单的模块。

这可能是结构示例: your_project ...菜单       ... clock_time_increment.py       ... use_clock.py

clock_time_increment.py中:

OPTION_L1 = "Clock increment:" 
OPTIONS = [str(x) + " second(s)" for x in range(0, 21, 2)] # Menu options (displayed to user)

另一个样式相同的模块。

def yes(board): # Called when user presses "yes"
    durations = range(0, 21, 2)
    board.clock_time_increment = durations[board.co] # board.co is the menu option the user selected
    board.start_game()