在 Python 中的 class 之外定义 class 方法

Defining a classmethod outside of a class in Python

我正在用 Pygame 制作一个游戏,其中会有许多不同的屏幕。我正在制作一个名为 Screen 的 class,它将为您制作自定义屏幕。不过我需要每个屏幕都有不同的事件和触发器,所以我不能只在 class 中定义一个函数。我需要为每个屏幕提供单独的功能,这意味着我需要为每个屏幕定义 class 定义之外的功能。我不知道这是否可能,但很高兴知道。 我还没有走得太远,但这是代码:

import pygame


class Screen:
    def __init__(self, size, bg_color, bg_image):
        self.size = size
        self.bg_color = bg_color
        self.bg_image = bg_image
        self.layers = []
        self.screen = pygame.display.set_mode(self.size)

    # some code was taken out here to save space (it was just some x y width and height getters and setters)

    def add_item(self, item, layer=None):
        if layer is None:
            self.layers.append(item)
        else:
            self.layers.insert(layer, item)

    def remove_item(self, item):
        self.layers.remove(item)

    def draw(self):
        self.screen.fill(self.bg_color)
        self.screen.blit(self.bg_image)

        for item in self.layers:
            self.screen.blit(item, item.pos)

您可以在 class 之外创建一个普通函数并将其作为参数之一传递给您的 class。

您可以通过两种方式执行此操作:

  1. NinjaFaraz 已经给出了一个。您只需在 class 之外定义函数,然后为每个屏幕创建一个包含可用函数的字典或列表。您甚至可以在程序执行期间传递新函数以动态增强或减少屏幕的功能。

  2. 第二种选择是继承。仅当不需要太多类型的屏幕时,这才有意义。如果是这种情况,您可以拥有一个具有基本功能的基础 class“屏幕”,所有其他屏幕都将从该 class 继承。如果 classes 不能动态地 gain/loose 新功能,这是有道理的。

这两种方法中哪一种更好取决于您的具体情况,目前无法根据您提供的信息回答。

I need each screen to have different events and triggers though

所以您正在搜索 Inheritance. Read about Inheritance and Polymorphism in Python 使用 Screen 作为基础 class。从 Screen 导出不同的 classes,您可以在其中实现不同的行为:

class Screen:
    def __init__(self, size, bg_color, bg_image):
        # [...]
  
    # [...]
class Screen_1(Screen):
    def __init__(self, size, bg_color, bg_image):
        super().__init__(size, bg_color, bg_image)

    def my_method():
        # do something
        # [...]
class Screen_2(Screen):
    def __init__(self, size, bg_color, bg_image):
        super().__init__(size, bg_color, bg_image)

    def my_method():
        # do something different
        # [...]