self是实例,类中定义函数必须加self
和普通函数相比,在类中定义函数只有一点不同,即类中定义的函数的第一参数永远是self,表示创建的类实例本身,因此,在该函数内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。在创建实例的时候,就不能传入空的参数了,必须传入与方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去:
class Student(object):
def __init__(self, name, score):
self.name = 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
封装小记
从外部看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
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,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。