我在写一个游戏,里面的东西可能会被特效修改。我决定使用python的能力来分配给实例,而不是类。请注意,这不是修改整个类的成员,而是修改它的一个实例。把它看作是MtG中的一种地方魅力。你知道吗
我怎样才能回到原来班级的成员那里?你知道吗
以下面的代码示例为例:
class Dog(object):
noise = "Woof!"
def bark(self):
print self.noise
def make_alpha(self):
self.noise = self.noise.upper()
class Bulldog(Dog):
noise = "Grr!"
class EnormousBulldog(Bulldog):
pass
puppy = Dog()
print puppy.bark() # Woof!
bulldog = Bulldog()
print bulldog.bark() #Grr!
big_dog = EnormousBulldog()
print big_dog.bark() # Grr!
big_dog.make_alpha()
print puppy.bark() # Woof!
print bulldog.bark() # Grr!
print big_dog.bark() # GRR!
这一切都有效。你知道吗
但是假设我想创建一个remove\u alpha()方法。我可以尝试反转make_alpha()对噪音的影响(因此在实际游戏中对每个可能的特殊效果都这样做),但我感觉到在这条路上有疯狂。更简单的方法是回到斗牛犬。噪音. 但是大斗牛犬是怎么做到的呢斗牛犬。噪音?你知道吗
self.__dict__["noise"]
将给出修改后的噪声。你知道吗
EnormousBulldog.__dict__
不会给我任何信息,因为噪声在Bulldog中,它的超类。你知道吗
type(self).__getattribute__(self, "noise")
将看到有一个修改过的噪声,并给我这个代替。你知道吗
我考虑过重写__getattribute__
,而不是将实例作为一个完全替代的体系结构来更改,但我认为性能上的损失是不值得的。你知道吗
有什么想法吗?你知道吗
超类变量始终可用作
self.__class__.noise
或EnormousBulldog.noise
或getattr(self.__class__, 'noise')
。你知道吗或者,如果您的问题是“如何取消每个实例的更改”,那么
del
实例的属性,可能带有一个保护:之后,属性查找将在超类中找到它。你知道吗
不,不要把
__getattr__
和__getattribute__
混淆;你想覆盖前者__getattr__
;后者几乎肯定不是你想做的。你知道吗我建议采用一种不同的方法,这种方法会对性能产生一些影响,但会使代码更简单、更灵活:
缺点:
优点:
有一个相当肮脏和混乱的解决方案,但这可能会满足您的需要:它依赖于这样一个事实,即在类属性之前对实例属性求值:
输出:
所发生的事情是,当您调用
make_alpha
时,一个新的noise
属性被添加到实例,它取代了类级别上的noise
属性。您可能需要检查内置的vars做什么。你知道吗相关问题 更多 >
编程相关推荐