面向对象编程
面向对象的特性
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承:面向对象编程 (OOP) 语言的一个主要功能就是“继承”。它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态:允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态是为了实现接口重用!
例子:
1 # Author:RYB 2 # __*__coding:utf-8__*__ 3 4 class Dog(object): 5 def __init__(self,name,type): 6 self.name = name 7 self.type = type 8 def bark(self): 9 print("%s I am a dog!" % self.name) 10 def eat(self,food): 11 print("%s eating %s" %(self.name,food)) 12 d1=Dog("lucy","zangao") 13 print(d1.name,d1.type) 14 d1.bark() 15 d1.eat("bread")
运行结果:
lucy zangao
lucy I am a dog!
lucy eating bread
封装
类变量:作为默认公有属性;全局修改,增加新属性。
实例变量:即成员属性,存在自己内存空间里的属性。每个实例独有的属性。构造函数(初始化函数)里的变量都是实例变量;每个实例都可以增加(修改)自己的实例变量。
公有属性:对应类变量。
私有属性:__属性名,用来表示私有属性,不允许别人(外部)访问。只能在实例的内部各函数(方法)中调用。
继承
继承的实现方式主要有两种:1,直接继承;2,组合。
python支持多继承,一个子类可以继承多个基类(父类),但是一般情况下,一个子类只能有一个基类。
继承概念的实现方式主要包括两类:实现继承和接口继承。
继承的功能:1,直接调用父类方法;2,继承父类方法并重构父类方法,先重构,在重构的方法里手动调用父类方法;3,可以定义子类自己的方法;4,析构方法:__del__(self)。
继承例子1:继承+重构
1 # Author:RYB 2 # __*__coding:utf-8__*__ 3 4 class SchoolMember(object): 5 def __init__(self,name,age,sex): 6 self.name = name 7 self.age = age 8 self.sex = sex 9 def tell(self): 10 info = ''' 11 ---info of %s--- 12 name:%s 13 age;%s 14 sex:%s 15 '''%(self.name,self.name,self.age,self.sex) 16 print(info) 17 18 class Teacher(SchoolMember): #继承 19 def __init__(self,name,age,sex,salary): 20 SchoolMember.__init__(self,name,age,sex) #继承,调用SchoolMember类的初始化方法实现继承的目的。 21 self.salary = salary #重构 22 23 t=Teacher("lucy",28,"F",5000) 24 print(t.name,t.age,t.sex,t.salary)
运行结果:lucy 28 F 5000
继承例子2:创建学校,老师,学生三个类。
1 # Author:RYB 2 # __*__coding:utf-8__*__ 3 4 #学校类 5 class SchoolMember(object): 6 def __init__(self,name,age,sex): 7 self.name = name 8 self.age = age 9 self.sex = sex 10 def tell(self): 11 info = ''' 12 ---info of %s--- 13 name:%s 14 age;%s 15 sex:%s 16 '''%(self.name,self.name,self.age,self.sex) 17 print(info) 18 19 #老师类 20 class Teacher(SchoolMember): #继承 21 def __init__(self,name,age,sex,salary): 22 SchoolMember.__init__(self,name,age,sex) #继承,调用SchoolMember类的初始化函数(构造函数)实现继承的目的。 23 self.salary = salary #重构 24 def teaching(self,course): 25 print("%s is teaching %s"%(self.name,self.course)) 26 27 #学生类 28 class Student(SchoolMember): 29 def __init__(self,name,age,sex,grade): 30 SchoolMember.__init__(self,name,age,sex) 31 self.grade = grade 32 def pay_tuition(self,total): 33 self.tuition = total 34 print("student %s has paid tuition fee total %s"%(self.name,total)) 35 36 t=Teacher("lucy",28,"F",5000) 37 s=Student("lily",25,"M","p16") 38 s2=Student("lilei",35,"M","p17") 39 40 t.tell() 41 s.tell() 42 s2.tell()
运行结果:
---info of lucy---
name:lucy
age;28
sex:F
---info of lily---
name:lily
age;25
sex:M
---info of lilei---
name:lilei
age;35
sex:M
继承例子3:
1 # Author:RYB 2 # __*__coding:utf-8__*__ 3 4 #学校类 5 class SchoolMember(object): 6 def __init__(self,name,age,sex): 7 self.name = name 8 self.age = age 9 self.sex = sex 10 def tell(self): 11 info = ''' 12 ---info of %s--- 13 name:%s 14 age;%s 15 sex:%s 16 '''%(self.name,self.name,self.age,self.sex) 17 print(info) 18 19 #老师类 20 class Teacher(SchoolMember): #继承 21 def __init__(self,name,age,sex,salary): 22 SchoolMember.__init__(self,name,age,sex) #继承,调用SchoolMember类的初始化函数(构造函数)实现继承的目的。 23 self.salary = salary #重构 24 def teaching(self,course): 25 print("%s is teaching %s"%(self.name,course)) 26 27 #学生类 28 class Student(SchoolMember): 29 def __init__(self,name,age,sex,grade): 30 SchoolMember.__init__(self,name,age,sex) 31 self.grade = grade 32 def pay_tuition(self,total): 33 self.tuition = total 34 print("student %s has paid tuition fee total %s"%(self.name,total)) 35 36 t=Teacher("lucy",28,"F",5000) 37 s=Student("lily",25,"M","p16") 38 s2=Student("lilei",35,"M","p17") 39 40 t.teaching("python") 41 s.pay_tuition(1000)
运行结果:
lucy is teaching python
student lily has paid tuition fee total 1000
继承例子4: 统计新学校成员(实例)的数量,如果成员被开除了,统计还剩多少成员。
1 # Author:RYB 2 # __*__coding:utf-8__*__ 3 4 #学校类 5 class SchoolMember(object): 6 members=0 7 def __init__(self,name,age,sex): 8 self.name = name 9 self.age = age 10 self.sex = sex 11 SchoolMember.members+=1 #统计新学校成员数量 12 print("初始化了一个新学校成员",self.name) 13 def tell(self): 14 info = ''' 15 ---info of %s--- 16 name:%s 17 age;%s 18 sex:%s 19 '''%(self.name,self.name,self.age,self.sex) 20 print(info) 21 def __del__(self): #析构方法,实例销毁时自动执行的事情(动作)。 22 print("%s被开除了" %self.name) 23 SchoolMember.members-=1 24 25 #老师类 26 class Teacher(SchoolMember): #继承 27 def __init__(self,name,age,sex,salary): 28 SchoolMember.__init__(self,name,age,sex) #继承,调用SchoolMember类的初始化函数(构造函数)实现继承的目的。 29 self.salary = salary #重构 30 def teaching(self,course): 31 print("%s is teaching %s"%(self.name,course)) 32 33 #学生类 34 class Student(SchoolMember): 35 def __init__(self,name,age,sex,grade): 36 SchoolMember.__init__(self,name,age,sex) 37 self.grade = grade 38 def pay_tuition(self,total): 39 self.tuition = total 40 print("student %s has paid tuition fee total %s"%(self.name,total)) 41 42 t=Teacher("lucy",28,"F",5000) 43 s=Student("lily",25,"M","p16") 44 s2=Student("lilei",35,"M","p17") 45 s3=Student("lili",15,"M","p18") 46 del s3 47 del s2 48 49 t.teaching("python") 50 s.pay_tuition(1000) 51 print(SchoolMember.members) #统计新学校成员数量
运行结果:
初始化了一个新学校成员 lucy
初始化了一个新学校成员 lily
初始化了一个新学校成员 lilei
初始化了一个新学校成员 lili
lili被开除了
lilei被开除了
lucy is teaching python
student lily has paid tuition fee total 1000
2
lucy被开除了
lily被开除了