我正在构建一个菜单系统,其中每个特定的菜单都作为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__
方法的类来构造菜单的方式有什么问题吗?我可以使用更好的数据结构来获得相同的功能吗?
谢谢,如果您需要它们,请要求澄清!
答案 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()