1.实例拥有各自的数据之后,我们就可以用函数直接访问这些数据,比如打印一个学生的名字和分数
>>> def print_score(std): ... print('%s: %s' % (std.name, std.score))
...
>>> print_score(bart) Bart Simpson: 59
2.封装的好处:第一个是可以用函数直接调用学生的数据,第二个是给类增加新的方法
class Student(object):
...
def get_grade(self): #此处依旧是用self
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
同样的 ger_grade 方法可以直接在实例变量上调用,不需要内部实现细节;
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
if self.score >= 90:
return 'A'
elif self.score >= 60:
return 'B'
else:
return 'C'
lisa = Student('Lisa', 99) bart = Student('Bart', 59) print(lisa.name, lisa.get_grade()) print(bart.name, bart.get_grade())
3.访问限制
在Class中,如果让内部属性不让外部访问,在属性的名称前加__ python中 实例变量名以__开头 则变成了一个私有变量,只有内部能访问:
我们修改Student的这个类
class Student(object):
def __init__(self, name, score):
self.__name = name #把self.name 改为了self.__name 属性的名称前加__
self.__score = score
def print_score(self):
print('%s: %s' % (self.__name, self.__score))
此时用命令 bart = Student(Bart Simpson,59)
bart.__name
就不能访问了bart的属性了,但是要从外部访问呢
就可以在类中添加方法,然后用该方法返回之前的bart属性
def get_name(self):
return self.__name
如果要从外部修改属性代码怎么办呢?
依旧添加方法
def set_score(self, score):
self.__score = score #在类中添加方法
未避免传入无效参数,在方法中可以用一个if条件句来检查。
def set_score(self, score):
self.__score = score
class Student(object):
...
def set_score(self, score):
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('bad score')
双下线的实例变量其实也可以在外部访问,私有实例其实是python解释器将__name实例变成了_Student__name,所以我们可以通过访问_Student__name来访问__name变量;
>>> bart._Student__name
def set_score(self, score):
self.__score = score