Python类声明中的变量用法

Dom*_*bey 1 python variables class

以下是Zed Shaw的"学习Python困难之路"教程40的代码片段:

class Song(object):

    def __init__(self, lyrics):
        self.lyrics = lyrics

    def sing_me_a_song(self):
        for line in self.lyrics:
            print line
Run Code Online (Sandbox Code Playgroud)

为什么Python在定义"sing_me_a_song"函数时允许使用"self.lyrics"?是因为在" init " 下定义的变量也可以在同一个类的其他地方使用吗?

谢谢.

Mat*_*ams 5

实例变量

这称为实例变量.任何用self."前缀" 定义的变量都可以用在对象的任何方法中.通常会创建这样的变量__init__,因此可以从初始化对象的那一刻开始访问它们,尽管您可以在其他方法中定义实例变量.例如:

>>> class foo:
...     def fun(self):
...             self.heh=3
... 
>>> f = foo()
>>> f.heh 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: foo instance has no attribute 'heh'
>>> f.fun()
>>> f.heh
3
Run Code Online (Sandbox Code Playgroud)

注意初始化实例变量之外的危险__init__; 如果在尝试访问它们之前未调用它们的初始化方法,则会出现错误.

类变量

这不要与"类变量"混淆,"类变量"是可以由类的任何方法访问的另一种类型的变量.可以为整个类设置类变量,而不仅仅是该类的特定对象.这是一个带有实例和类变量的示例类来显示差异:

class MyClass:
    classVar = "I'm a class var."
    def __init__(self):
        self.instanceVar = "I'm an instance var."
    def fun(self):
        methodVar = "I'm a method var; I cannot be accessed outside of this method."
        self.instanceVar2 = "I'm another instance var, set outside of __init__."
Run Code Online (Sandbox Code Playgroud)

关于"方法"与"功能"的说明

在你的问题中,你称之为sing_me_a_song"功能".实际上,它是班级的一种方法Song.这与常规的旧函数不同,因为它基本上与类相关联,因此也与该类的对象相关联.