【问题标题】:Defining a classmethod outside of a class in Python [closed]在 Python 中的类之外定义类方法 [关闭]
【发布时间】:2020-11-14 02:27:21
【问题描述】:

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

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)

【问题讨论】:

  • 也许为屏幕创建一个基类,并使用继承专门化每个屏幕?请发布一个简化示例mvce
  • 你做了什么?
  • 一种解决方案是创建一个 Screen 类并在该类中为每个不同的屏幕创建不同的函数。我用 PyGame 制作的游戏就是这样做的

标签: python class pygame class-method pygame-surface


【解决方案1】:

有两种方法可以做到这一点:

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

  2. 第二个选项是继承。仅当不需要太多类型的屏幕时,这才有意义。如果是这种情况,您可以拥有一个带有基本功能的基类“屏幕”,并且所有其他屏幕都将从该类继承。如果类不能动态获得/失去新功能,这是有道理的。

这两种方法中哪一种更好取决于您的具体情况,目前还不能用您提供的信息来回答。

【讨论】:

    【解决方案2】:

    我需要每个屏幕都有不同的事件和触发器

    所以您正在搜索Inheritance。阅读Inheritance and Polymorphism in Python 使用Screen 作为基类。从Screen 派生不同的类,您可以在其中实现不同的行为:

    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
            # [...]
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 2016-09-07
        • 1970-01-01
        • 2013-03-07
        • 2016-09-02
        相关资源
        最近更新 更多