# self小记

248 阅读2分钟

self是实例,类中定义函数必须加self

和普通函数相比,在类中定义函数只有一点不同,即类中定义的函数的第一参数永远是self,表示创建的类实例本身,因此,在该函数内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。在创建实例的时候,就不能传入空的参数了,必须传入与方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去:
class Student(object):
    def __init__(self, name, score):
        self.name = name
        #self.name就是Student类的属性变量(由构造函数创建的),是Student类所有。
        #而name是外部传来的参数,不是Student类所自带的
        #把外部传来的参数name的值赋值给Student类自己的属性变量self.name
        self.score = score
    def print_score(self):
        print (self.name+self.score)
    def ppr():#定义和调用时均不传类实例也可以
        print('__class__')
student = Student("tian", 99)
student.name
student.print_score
#Python解释成Student.print_score(student),所以self一定要写

封装小记

从外部看Student类,创建实例需要给出name和score。而如何打印,都是在Student类的内部定义的,这些数据和逻辑被封装起来了,调用很容易,但却不知道内部实现的细节。
在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score
    def print_score(self):
        print (self.__name+self.__score)
student = Student('tian', 99)
student.__name
这样通过访问限制的保护,代码更加健壮。如果外部代码要获取或修改name和score,可以给Student类增加get_name和get_score这样的方法:
class Student(object):
    def get_name(self):
        return self.__name
    def get_score(self):
        return self.__score
    def set_score(self, score):
        self.__score = score
#封装的另一个好处是可以随时给Student类增加新的方法,比如:
get_grade:class Student(object):
。。。。。。。。。。。。。。。
    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'
变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。