python - 是否可以在 python 中向导入的类添加属性?

标签 python class attributes pygame

我将解释我的情况,以便我的问题更有意义。

我正在使用 python 和 pygame 编写游戏。这是一款非常简约的游戏,没有很多图形,我希望每个关卡都是黑色或白色方 block 的网格。我认为将每个级别定义为一串 1 和 0 更有意义

0000
0101
1010
1111

相对于:

level1 = (pygame.Rect(0, 0, 100, 100), pygame.Rect(100, 0, 100, 100),
pygame.rect(200, 0, 100, 100), pygame.rect(300, 0, 100, 100),
...
...

依此类推每个矩形。第二种方式笨拙笨拙,并且会使关卡设计变得非常困难。同样在 python 中,可读性很重要,漂亮总比丑陋好。 =)

我计划使用第一种方式,并有一个函数返回 pygame.Rect 对象列表(类似于上面的代码),其中 0 是黑色方 block ,1 是白色方 block 。不幸的是,pygame.Rect 对象不包含任何关于它们是什么颜色的数据。

现在我的问题有两个。

1) 是否可以将属性添加到现有类(在本例中,添加属性 rect.color)而无需进入它来自的模块的源代码并自行更改它? (因为这似乎是一个非常糟糕的主意。)

2)如果以上是可能的,是明智的吗?还是搬起石头砸自己的脚?

当然明白,我意识到这不是完成我想要的唯一方法。如果我想以久经考验的方式做到这一点,我会创建一个这样的类:

class tile:
    def __init__(self, x, y, width, height, color):
        self.rect = pygame.Rect(x, y, width, height)
        self.color = color

    def draw(self):
        pygame.draw.rect(displaysurface, self.color, self.rect)

这绝对是显而易见的方法,并且可以很好地满足我的需要。但是,我想知道这是否可能。如果是,它似乎在某些情况下非常有用。

************************编辑******************** ******

好的,我采纳了 shiplu.mokadd.im 的建议并尝试使用 setattr(),但这只适用于我自己定义的类,而不适用于导入的类。这是一个例子:

class pet:
    def __init__(self, name, species):
        self.name = name
        self.species = species

fido = pet('Fido', 'Dog')
setattr(fido, 'breed', 'Golden Retriever')

print fido.breed

按预期输出“Golden Retriever”。然而这个例子:

import pygame

pygame.init()

rect = pygame.Rect(0, 10, 20, 30)

setattr(rect, 'color', "BLACK")
print rect.color

输出这个错误。

Traceback (most recent call last):
  File "game.py", line 7, in <module>
    setattr(rect, 'color', "BLACK")
AttributeError: 'pygame.Rect' object has no attribute 'color'

我意识到我应该这样做:

class ColoredRect(Rect):
    def __init__(self, color, ...):
        self.color = color
        super(ColoredRed, self).__init__(self, ...)

但是可能以我一直尝试的方式添加属性吗?

此外,我希望无论谁审查“可能重复”问题,都意识到我并不是要添加方法... =)

最佳答案

是的,它可以将属性添加到实例和类(作为它的一个对象)。只需使用 setattr

但是你为什么要这么做?你应该继承 Rect 类并创建一个 ColoredRect

class ColoredRect(Rect):
    def __init__(self, color, ...):
        self.color = color
        super(ColoredRed, self).__init__(self, ...)

关于python - 是否可以在 python 中向导入的类添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24358655/

相关文章:

python - 将 argparse 别名解析回原始命令

c++ - 重载运算符(operator) body 的奥秘

c# - 如何向 log4net 消息添加类别前缀?

c# - 使用方法名称的属性

python - 无法显示静态图像和 css 文件

python - 类型为 'f' 的对象的未知格式代码 'unicode'

替换了 Python 空匹配

java - 我如何证明类加载在 Java 中只发生一次?

java - 使用反射在方法中检索类

.net - 如何使用反射通过属性标签名称设置属性值?