首页 > 解决方案 > 将不同的东西分配给由类制成的对象的最有效方法?

问题描述

我经常遇到这样的问题,但这里有一个例子。

假设我正在为游戏制作主菜单。该开发者提供了 5 个按钮,播放、设置、关卡选择、教程等。我想为每个按钮使用相同的类。它们中的每一个都将具有不同的显示文本、位置和颜色。我可以做耗时的 if 语句,但有没有更快的方法?

def __init__(self):
    self.button=button
    if self.button=="play":
        self.text="play"
    elif self.button=="settings":
        self.text="settings"

     #and so on...

我现在使用的方法是列表。

text=["play","settings","tutorial"]
colors=[black,white,red]

for i in range(3):
    button=button_class()
    button.text=text[i]
    button.color=colors[i]

它一直工作得很好,但我仍然没有做任何涉及每个类的更具体数据的事情。我想知道是否有人对此有任何见解?毕竟这是 Python,我相信有一个简单的解决方案。哦,如果有任何帮助,我正在使用 pygame。

标签: pythonclass

解决方案


我会用

buttons = [button_class("play", black),
           button_class("settings", white),
           button_class("tutorial", red)]

为了实现这一点,__init__需要像:

def __init__(self, text:str, color):
    self.text = text
    self.color = color

像这样的代码

def __init__(self):
    self.button=button
    if self.button=="play":
        self.text="play"
    elif self.button=="settings":
        self.text="settings"

违反了干净代码的OCP(Open Closed Principle)。每当您想添加新按钮时,该类都需要修改。OCP 说一个类应该对修改关闭,但仍然对扩展开放。

通过我上面发布的示例,您仍然可以创建许多不同的按钮(“打开”),但无需更改按钮类本身(“关闭”)。


编码

text=["play","settings","tutorial"]
colors=[black,white,red]

for i in range(3):
    button=button_class()
    button.text=text[i]
    button.color=colors[i]

确实已经更好了,但是恕我直言,违反了 KISS 原则(保持简单,愚蠢)。

在那段代码中,开发人员需要确保text并且color始终具有相同数量的元素,并且for循环具有正确的范围。

在我上面发布的示例中,如果没有 IDE 事先抱怨,您几乎不会出错。


推荐阅读