天天看点

Python类和方法中的self

刚开始进入Python的面向对象阶段的学习。发现在给类写方法时必须加上self参数,而方法(函数)块中的变量(对象)名前有时加了self,有时没加,常常被此示例程序弄得一头雾水,于是老实回头补课。网上关于这个self的解释、详解、深入剖析之类的文章数不胜数,可是要么太简,要么太繁,要么示范不够直观,反正是总难得“浅显易懂”的感觉。

认真摸索一番后,我写了下面这段测试代码,希望对类似我这种理解能力的人有所帮助:

class ABC(object):
    x='x in ABC'
    print('ABC- x:',x)
    
#    self.x='x in ABCself'
#    print(self.x)

    def aa(self,x):
        x='x in aa'
        print('aa - x:',x)
        print('self.x:',self.x)
        print('self is:',self)

t=ABC()
t.aa("")

'''
输出结果:
ABC- x: x in ABC
aa - x: x in aa
self.x: x in ABC
self is: <__main__.ABC object at 0x0334F290>
'''
           

我的理解是,self指向于类本身,写方法时加上self参数,表示构造一个只属于这个类的方法,调用类方法后,selft指代的就是这个类创建的实例对象。

因此,在方法块中的某变量(如例中的x)前加上前缀“self.”,表示引用这个类(例中的ABC)的某属性,如果类代码中没有该属性,就会报错(比如本例中如果没有 x='x in ABC' ,就会报:AttributeError: 'ABC' object has no attribute 'x')。

另外,类本身是没有self的概念,如果写类本级代码时加前缀self,self被视作一个名为self的普通属性处理,运行时会报错,提示self未定义(NameError: name 'self' is not defined)。