Day6:面向对象
一、面向对象
1、类变量的作用:大家共用的属性
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# Author:licy class Role: n=123 #类变量 def __init__(self,name,role,weapon,life_value=100,money=15000): #构造函数,在实例化时做一些类的初始化的工作 self.name=name#实例变量(静态属性),作用域就是实例本身 self.role=role self.weapon=weapon self.life_value=life_value self.money=money def shot(self):#类的方法,功能(动态属性) print('%s shoting....' % self.name) r1=Role('licy','police','911')#实例化类为一个对象 r1.shot()
2、析构函数:在实例释放、销毁的时候执行的,通常做一些收尾工作,关闭一些数据库连接,临时文件等
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# Author:licy class Role: n=123 #类变量 def __init__(self,name,role,weapon,life_value=100,money=15000): #构造函数,在实例化时做一些类的初始化的工作 self.name=name#实例变量(静态属性),作用域就是实例本身 self.role=role self.weapon=weapon self.life_value=life_value self.money=money def __del__(self): print('执行了析构函数') def shot(self):#类的方法,功能(动态属性) print('%s shoting....' % self.name) r1=Role('licy','police','911')#实例化类为一个对象 r1.shot() r2=Role('licy2','police','911')#实例化类为一个对象 r2.shot() print(r2.name) #为什么两次执行析构函数挨着呢,因为当你实例化类得到r1和r2的时 # 候都没有手动释放实例,那么只有在程序结束的时候它自动释放了,所以在最后输出
3、私有属性和私有方法:在属性和方法前加__
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# Author:licy class Role: n=123 #类变量 def __init__(self,name,role,weapon,life_value=100,money=15000): #构造函数,在实例化时做一些类的初始化的工作 self.__name=name#实例变量(静态属性),作用域就是实例本身 self.role=role self.weapon=weapon self.life_value=life_value self.money=money def __del__(self): print('执行了析构函数') def shot(self):#类的方法,功能(动态属性) print('%s shoting....' % self.name) r1=Role('licy','police','911')#实例化类为一个对象 r1.shot() r2=Role('licy2','police','911')#实例化类为一个对象 r2.shot() print(r2.__name)#报错 #为什么两次执行析构函数挨着呢,因为当你实例化类得到r1和r2的时 # 候都没有手动释放实例,那么只有在程序结束的时候它自动释放了,所以在最后输出
4、继承:
python2:经典类是按深度优先来继承的,新式类是按广度优先来继承的
python3:经典类和新式类都是按广度优先来继承的
(1)单继承
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# Author:licy #class People: 经典类 class People(object): #新式类 def __init__(self,name,age): self.name=name self.age=age def eat(self): print("%s is eating..." % self.name) def talk(self): print("%s is talking..." % self.name) def sleep(self): print("%s is sleep..." % self.name) class Man(People): def __init__(self,name,age,money): #People.__init__(self,name,age) 继承父类构造方法方式一 经典类写法 super(Man, self).__init__(name,age) #方式二 新式类的写法 self.money=money print("%s一出生就有%s元" % (self.name,self.money)) def piao(self): print("%s is piaoing" % self.name) def sleep(self): People.sleep(self) print("my sleep") class Woman(People): def birth(self): print("%s is sheng" % self.name) m1=Man("licy",22,900) m1.piao() m1.sleep() w1=Woman("zhangfei",23) w1.birth()
(2)多继承
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# Author:licy #class People: 经典类 class People(object): #新式类 def __init__(self,name,age): self.name=name self.age=age def eat(self): print("%s is eating..." % self.name) def talk(self): print("%s is talking..." % self.name) def sleep(self): print("%s is sleep..." % self.name) class Relation(object): def make_friends(self,obj): print("%s tring to %s" % (self.name,obj.name)) class Man(People,Relation): def __init__(self,name,age,money): #People.__init__(self,name,age) 继承父类构造方法方式一 经典类写法 super(Man, self).__init__(name,age) #方式二 新式类的写法 self.money=money print("%s一出生就有%s元" % (self.name,self.money)) def piao(self): print("%s is piaoing" % self.name) def sleep(self): People.sleep(self) print("my sleep") class Woman(People,Relation): def birth(self): print("%s is sheng" % self.name) m1=Man("licy",22,900) m1.piao() m1.sleep() w1=Woman("zhangfei",23) w1.birth() m1.make_friends(w1)
(3)例子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# Author:licy class School(object): def __init__(self,name,addr): self.name=name self.addr=addr self.students=[] self.staffs=[] def enroll(self,stu_obj): print("为学员%s 办理注册手续"%stu_obj.name) self.students.append(stu_obj) def hire(self,staff_obj): print("雇佣新员工%s 办理注册手续"%staff_obj.name) self.staffs.append(staff_obj) class SchoolMember(object): def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def tell(self): pass class Teacher(SchoolMember): def __init__(self,name,age,sex,salary,course): super(Teacher, self).__init__(name,age,sex) self.salary=salary self.course=course def tell(self): print(''' Name:%s Age:%s Sex:%s Salary:%s Course:%s '''%(self.name,self.age,self.sex,self.salary,self.course)) def teach(self): print("%s is teaching course[%s]" % (self.name,self.course)) class Student(SchoolMember): def __init__(self,name,age,sex,stu_id,grade): super(Student, self).__init__(name,age,sex) self.stu_id=stu_id self.grade=grade def tell(self): print(''' Name:%s Age:%s Sex:%s Stu_id:%s Grade:%s ''' % (self.name,self.age,self.sex,self.stu_id,self.grade)) def pay_tuition(self,amount): print("%s has paid tution for $%s" % (self.name,amount)) school = School("老男孩IT","沙河") t1=Teacher("Oldboy",56,"MF",2000000,"Linux") t2=Teacher("Licy",22,"M",3000,"Python") s1=Student("LiChunYu",36,"MF",1001,"Python") s2=Student("ZhangSan",22,"F",1002,"Linux") t1.tell() s1.tell() school.hire(t1) school.enroll(s1) school.enroll(s2) print(school.students) print(school.staffs) school.staffs[0].teach() for stu in school.students: stu.pay_tuition(5000)
5、多态:一种接口,多种实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# Author:licy #_*_coding:utf-8_*_ class Animal(object): def __init__(self, name): # Constructor of the class self.name = name def talk(self): # Abstract method, defined by convention only #raise NotImplementedError("Subclass must implement abstract method") pass @staticmethod def func(obj): #一个接口,多种形态 obj.talk() class Cat(Animal): def talk(self): print('%s: 喵喵喵!' %self.name) class Dog(Animal): def talk(self): print('%s: 汪!汪!汪!' %self.name) c1 = Cat('小晴') d1 = Dog('李磊') Animal.func(c1) Animal.func(d1)