class Death(Scene):
quotes = [
"You are dead.",
"Haha. bad.",
"Sorry, you died.",
"Probably should try something different."
]
def enter(self):
print Death.quotes[randint(0, len(self.quips)-1)]
exit(1)
好的,所以我是编程的新手,并且正在通过制作基于文本的游戏来学习类的使用,但我不确定为什么使用Death.quips而不是self.quips,或者更确切地说为什么death.quips是不使用而不是self.quips。我认为这与当地对讽刺的引用有关,但我不知道为什么你必须在特定情况下使用每一种。谢谢!
答案 0 :(得分:3)
quotes
是一个类变量,而不是实例变量。如果它是一个实例变量,它将使用
self.quotes = [...]
并且需要在提供self
参数的方法中设置(如enter
方法中所示)
ClassName.variable
访问类变量,而通过self.variable
访问类中的实例变量。
可在此处找到一个很好的参考资料:http://timothyawiseman.wordpress.com/2012/10/06/class-and-instance-variables-in-python-2-7/
答案 1 :(得分:0)
假设quips
你的意思是quotes
你实际上可以使用它们,但它们的影响会略有不同。
如果您使用Death.quotes
,则会在类Death
中查找名为quotes
的属性并将使用它。
如果您使用self.quotes
,则会首先查看实例self
内部,然后查看实例self
类中的quotes
属性。在您的特定示例中,这与调用Death.quotes
的行为相同,因为self
是类Death
的实例,但您应该注意一些关键差异:
1)如果您的实例变量self
也有一个名为quotes
的属性,那么将使用与以下示例所示相同名称访问它而不是class属性:
class Death(Scene):
quotes = [
'some awesome quote',
]
def __init__(self):
sef.quotes = ['foo']
def some_method(self):
# This will print out 'some awesome quote'
print Death.quotes[0]
# This will print out 'foo'
print self.quotes[0]
2)如果self
是Death
的子类的实例,并且该子类定义了它自己的类变量名quotes
,则使用self.quotes
将使用属性,如下例所示。
class Death(Scene):
quotes = [
'some awesome quote',
]
def some_method(self):
print self.quotes[0]
class DeathChild(Death):
quotes = [
'not so awesome quote'
]
instance1 = Death()
instance2 = DeathChild()
# This will print out 'some awesome quote'
instance1.some_method()
# This will print out 'not so awesome quote'
instance2.some_method()
现在您明白了,我会告诉您,通过子类化支持扩展实际上(通常)是一件好事,我自己会使用self.quotes
代替Death.quotes
,但它是了解原因很重要。