为什么我需要拨打'报价'在这种情况下,而不是使用自我?

时间:2014-05-26 02:50:34

标签: python class reference attributes

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。我认为这与当地对讽刺的引用有关,但我不知道为什么你必须在特定情况下使用每一种。谢谢!

2 个答案:

答案 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)如果selfDeath的子类的实例,并且该子类定义了它自己的类变量名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,但它是了解原因很重要。