接上一篇。
面向对象编程
1.访问限制
(1)让外部代码不能随意修改对象内部属性
在内部属性前加上两个下划线,外部代码就不能访问了。注意:在Python中,类似__xxx__的,即两个下划线开头和两个下划线结束的是特殊变量,不是private变量,所以要避免使用这种名字。
访问限制前:
class Student(object):
def __init__(self,name,score):
self.score=score
self.name=name
def print_score_name(self):
print("%s : %s"% (self.name,self.score))
bart=Student("Jerry",99)
bart.print_score_name()#注意这两个调用的不同方式
print(bart.name)
#输出Jerry:99
Jerry
访问限制后:
class Student(object):
def __init__(self,name,score):
self.__score=score#注意下划线的位置!
self.__name=name
def print_score_name(self):
print("%s : %s"% (self.__name,self.__score))
bart=Student("Jerry",99)
print(bart.name)#报错!
(2)使用get_属性名,让外部代码能够访问
(3)使用set_属性名,让外部代码能够修改属性
好处:可以进行参数检查,防止传入参数
class Student(object):
def __init__(self,name,score):
self.__score=score#注意下划线的位置!
self.__name=name
def print_score_name(self):
print("%s : %s"% (self.__name,self.__score))
def get_name(self):
return self.__name
def get_score(self):
return self.__score
def set_score(self,score):#参数检查
if 0<=score<=100:
self.__score=score
else:
raise ValueError("error score")
bart=Student("Jerry",99)
print(bart.get_score())#实现外部访问,输出99
bart.set_score(66)#实现修改
print(bart.get_score())#输出66
bart.set_score(-11)#报错:error score
2.继承和多态
(1)定义:
当我们要定义一个新的class时,可以从原有的一个class继承,被继承的旧class叫基类,父类或超类,继承的新class叫子类
(2)特点:
a.子类同时继承父类所有的功能
b.子类和父类同时拥有同一功能时,对子类的该功能进行修改,调用执行时会只执行子类的该功能,即子类可以覆盖父类的该功能实现多态。
class Fruit(object):
def color(self):
print("fruit is green")
class Apple(Fruit):
pass
class Banana(Fruit):
def color(self):
print("fruit is yellow")
apple=Apple()
banana=Banana()
print(apple.color())#继承 输出:fruit is green
print(banana.color())#多态 输出:fruit is yellow
def print_twice(fruit):
fruit.color()
fruit.color()#可以加上return
print(print_twice(Fruit()))#输出:fruit is green两次
print(print_twice(apple))#fruit is green 两次
print(print_twice(banana))#fruit is yellow两次