本知识点参考廖雪峰的Python课程 [https://www.liaoxuefeng.com]
感谢北京图灵知非的免费课程 [http://www.tulingxueyuan.com/]
2018/6/25 星期一 9:56:21
Python面向对象编程--01
面向对象的概念
-
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
-
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义对象的数据类型就是面向对象中类(Class)的概念
-
假如我们打印学生的成绩表
-
面向过程会这样实现,我们程序的执行流程是:
1 std1 ={'name':'yang','score':99} 2 std2 = {'name':'wen','score':99} 3 def print_score(std): 4 print('{0}:{1}'.format(std['name'],std['score']))
-
-
如果采用面向对象的设计思想。Student应该是一个对象,这个对象拥有name和score这两个属性,如果打印出学生的成绩,必须有student,然后才能把成绩打印出来:
1 class Student(object): 2 def __init__(self,name,score): 3 self.name = name 4 self.score = score 5 def print_score(self): 6 print('{0}:{1}'.format(self.name,self.score)) -
给对象发消息实际上就是调用对象的相关函数,我们成为对象的方法:
1 yang = Student('yangaoteng',100) 2 wen = Student('wangwenwen',99) 3 yang.print_score() 4 wen.print_score() -
小结:
- 面向对象是一种常见的思想,比方说数学公式就是众多经验统计出来的结果。比方说 动物、植物、都相当于类的概念
- 在Python中,所有数据类型都可以视为对象。
- 我们用 class创建类
- init,相当于构造函数,就是函数必须输入的值。
类和实例
-
面向对象最重要的两个概念就是 类(class)和 实例(Instance),类是抽象的模板(好比数学公式),而实例是根据类创建出来的’对象‘(好比用数学公式解出来的题)
-
还以上面的例子,在Python中,定义类通过class关键字:
1 class Student(object): 2 pass -
class后面跟着的是类名,Student,类名大写字符开头,后面紧跟着(object),这表示这个类来自哪里,括号里面的object可以不写
-
定义好了Student类,可以创建出Student的实例,创建实例通过类名+()现实:
yang = Student() -
这时候可以自由的给一个实例绑定属性
1 yang.name = 'yangaoteng' 2 yang.score = 1000 -
由于类有的时候会起到模板的作用,我们可以在创建实例的时候,把我们一些任务必须绑定的属性填写进去。我们可以通过一个特殊的 __ init _(前后个有两个),在创建实例的时候,就可以把 name , score 等属性绑定上去:
1 class Student(): 2 def __init__(self,name,score): 3 self.name = name 4 self.score = score -
__ init __ 方法的第一个参数永远是self,self表示创建的实例本身
-
有了__ init__ 方法,在创建实例的时候,就不能传入空的函数了,必须传入与__ init __ 方法匹配的参数,但self不需要传,Python解释器会自动上传进去。
1 >>> yang = Student('yangaoteng',100) 2 >>> yang.name 3 ’yangaoteng‘ 4 >>> yang.score 5 59 -
做到这里我们就可以搞事情了,我们可以对数据进行分类,大于90分的成绩为’A‘....,进行男女的分类。等等,对数据进行处理
1 # 创建一个实例,对男女进行分类,对‘成绩进行分类’ 2 class Student(): 3 def __init__(self,name,score,sex): 4 self.name = name 5 self.score = score 6 self.sex = sex 7 def Student_score(self): 8 a='男' 9 if self.sex =='男': 10 a= '男' 11 elif self.sex == '女': 12 a= '女' 13 if self.score >=80: 14 print('姓名{0},性别{1},成绩A'.format(self.name,a)) 15 16 elif self.score >=60: 17 print('姓名{0},性别{1},成绩B'.format(self.name,a)) 18 19 elif self.score >=0: 20 print('姓名{0},性别{1},成绩C'.format(self.name,a)) 21 else: 22 print('666')
访问限制
-
在class内部,有属性有方法有方法,外部代码可以直接调用实例变量的方法来进行操作,这样,就隐藏了内部的复杂逻辑。
-
但是,从前面的Student类的定义看,外部代码还是可以自由的修改实际的
name、score属性:1 >>> yang = Student('yangaoteng',100,'男') 2 >>> yang.score 3 100 4 >>> yang.score=0 5 >>> yang.score 6 0 -
这样我的成绩就被改变成了0分,显然是不可能的。如果想让内部属性不被外部访问,可以在属性名称前面加上两个下划线
__,在Python中,实例的变量如果以__开头,就是私有变量(private),只有内部可以访问,外部不可以访问。1 class Student(object): 2 def __init__(self,name,score): 3 self.__name = name 4 self.__score = score 5 def print_score(self): 6 print('{0}:{1}'.format(self.__name,self.__score)) -
改变完成之后,就无法通过外部访问了
1 >>> yang = Student('yangaoteng',100,'男') 2 >>> yang._name 3 Traceback (most recent call last): 4 File "<stdin>", line 1, in <module> 5 AttributeError: 'Student' object has no attribute '__name -
这样参数被隐藏了,我们无法在内部进行访问,我们就可以更好的处理数据。
1 # 2 class Student(): 3 def __init__(self, name, score): 4 self.__name = name 5 self.__score = score 6 7 def get_name(self): 8 return self.__name 9 10 def get_score(self): 11 return self.__score 12 13 def set_name(self,name): 14 self.__name = name 15 16 def set_score(self,score): 17 if 0<=score<=100: 18 self.__score = score 19 else: 20 raise ValueError("数值不规范,请输入(0-100)的数字") 21 22 def print_score(self): 23 print("{0}:{1}" % (self.__name, self.__score)) -
注意错误写法:
1 >>> yang =Student('yangaoteng',100,'男') 2 >>> yang.get_name() 3 'yangaoteng' 4 >>> yang.__name = 'wangwenwen' 5 >>> yang.__name 6 wangwenwen -
从表面看,外部代码成功设置了
__name变量,但实际是这个__name变量和class内部的__name不是一个变量!1 >>> yang.get_name() 2 'yangaoteng'