Python中self个人理解

#1.self代表类的实例,而非类
class Stest:
    def p(self):#可将self理解为实例t
        print(self)
        print(self.__class__)

t = Stest()#t为Stest的实例
t.p()

运行结果:
<__main__.Stest object at 0x00000000021D8860>
<class '__main__.Stest'>
#2.self总是指调用时的类的实例。
#在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例。
class Parent:
    def p(self):
        print(self)

class Child(Parent):
    def c(self):
        print(self)
child = Child()
child.c()
child.p()
parent = Parent()
parent.p()
parent.c()

运行结果:
<__main__.Child object at 0x00000000029A0198>
<__main__.Child object at 0x00000000029A0198>
<__main__.Parent object at 0x00000000029A0358>
    parent.c()
AttributeError: 'Parent' object has no attribute 'c'
#3.Python中的self用于类的方法中,不可省略
class Student():
    def __init__(self,name):
        self.name=name
    def pname():#如果去掉此处的self,提示pname() takes 0 positional arguments but 1 was given
        print('the student name is:',self.name)#如果去掉此处的self,会提示name 'name' is not defined   
            
s=Student('xiaola')
s.pname()

运行结果:
TypeError: pname() takes 0 positional arguments but 1 was given
#4.self也可以换成其他自己喜欢的词
class Student():
    def __init__(lucy,name):
        lucy.name=name
    def pname(lucy):
        print('the student name is:',lucy.name)        
s=Student('xiaola')
s.pname()

运行结果:
the student name is: xiaola
#5.同一个类中调用其他的方法时需要加self
class Test():
    def test1(self):           
        print('this is test1')
    def test2(self): 
        self.test1()
        test1()#不加self,报错:name 'test1' is not defined
t=Test()
t.test2()

运行结果:
this is test1
NameError: name 'test1' is not defined
#6.一个独立的函数不需要加上self参数
def Teather(tname):
    print('the teacher name is:',tname)
Teather('dala')

运行结果:
the teacher name is: dala
#7.当然,独立的函数加上self也不影响,但是没有必要
def Teather(self,tname):
    print('the teacher name is:',tname)
Teather('','dala')#需传入一个空参数

运行结果:
the teacher name is: dala
#8.self的作用主要表示这个变量是类中的公共变量
#在类的一个方法定义了一个变量name1,这个变量就唯一的属于setname这个方法,其他方法无法使用这个变量
#使用self会告诉所有的方法,这个变量是我们共有的,可以随便用
class Student():
    def setname(self):
        name1='jay'            
        self.name='joly'
    def getname(self): 
        print('her name is:',self.name) 
        print('his name is:',name1)#报错:name 'name1' is not defined
s=Student()
s.setname()
s.getname()

运行结果:
her name is: joly
NameError: name 'name1' is not defined
#9.self的属性,名称前加上两个下划线,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
class Student2():
    def setname(self):  
        self.name1='jay'         
        self.__name2='joly'
    def getname(self): 
        print('her name is:',self.name1,self.__name2) 
s=Student2()
s.setname()
s.getname()
print(s.name1)
print(s.__name2)

运行结果:
her name is: jay joly
jay
AttributeError: 'Student2' object has no attribute '__name2'


版权声明:本文为qq_15158911原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。