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

时间:2014-06-23 05:02:09

标签: python class attributes pygame

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

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

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是黑色图块,1' s是白色瓷砖。不幸的是,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)

这绝对是显而易见的方式,适用于我需要的东西。但是,我想知道这是否可行。如果是,似乎在某些情况下它可能非常有用。

******** EDIT ******************** ******

好的,我使用了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

输出"金毛猎犬"正如所料。但是这个例子:

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, ...)

可能以我正在尝试的方式添加属性?

另外,我希望无论谁评论&#34;可能重复&#34;问题,意识到我没有尝试添加方法... =)

1 个答案:

答案 0 :(得分:2)

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

但你为什么那样做?你应该继承Rect类并制作ColoredRect

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