我将解释我的情况,以便我的问题更有意义。
我正在使用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;问题,意识到我没有尝试添加方法... =)
答案 0 :(得分:2)
是的,可以将属性添加到实例和类(也是它的对象)。只需使用setattr
即可。
但你为什么那样做?你应该继承Rect
类并制作ColoredRect
class ColoredRect(Rect):
def __init__(self, color, ...):
self.color = color
super(ColoredRed, self).__init__(self, ...)