python面向对象
1.面向对象编程跟面向过程对比
面向过程:
优点:复杂的问题流程化,进而简单化。
缺点:可扩展性差。
使用场景:linux系统管理脚本,linux内核等
面向对象:
优点:可扩展性强
缺点:编写难度大。
面向对象的程序设计只是用来解决程序扩展性的。需要结合相应场景使用。
2.类与对象
在现实世界中: 是现有对象,后有类
在程序中: 需要先定义类,后产生对象
3.类的定义方法
class OldboyStudent: school = 'oldboy' #类的数据属性 def learn(self): #类的函数属性 print('is learning')
##注意:类在代码定义阶段就会执行,所以就会产生名称空间,可以使用__dict__属性查看
print(OldboyStudent.__dict__) print(OldboyStudent.__dict__['school'])
#也可以进行修改、增加、删除等操作。 OldboyStudent.x=1111111111111111111111 OldboyStudent.school='Oldboy' # del OldboyStudent.school print(OldboyStudent.__dict__['school']) #在python3 中可以使用__dict__查看值,但是不能通过__dict__修改值。
4.python为类内置的特殊属性
类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
5.属性查找
类有两种属性:
数据属性,是所有对象都可以使用的,共享的。
函数属性,是绑定给对象用的。
6.继承
(1).继承的功能之一:解决类与累之间的代码重复的问题
(2)继承是类与类之间的关系,是一种,什么是什么的关系(比如oldboy的学生跟老师 都是oldboy学校的人)
(3)在子类派生出的新的属性,以自己为准。
(4)在子类派生出的新的方法内重用父类的功能的方式:指定道姓用。
OldboyPeople._init_
这种调用方式本身与继承是没有关系的
6.1 python中的继承分为:单继承和多继承。
class Aa: #定义父类 pass class Bb: #定义父类 pass class Cc(Aa): #单继承,派生类或者子类是Cc pass class Dd(Aa,Bb): #python支持多继承,用逗号隔开多个继承的类 pass print(Dd.__bases__) #查看继承关系
6.2 经典类跟新式类
python2中才有经典类跟新式类的区别,在python3中都是新式类
在python2中只有继承object类的类才是新式类
在Python2中没有继承object的类都是经典类
6.3 在子类中重用父类的方法并且自己单独定义一下变量
class Animal: x=1 def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def eat(self): print('%s eat' %self.name) def talk(self): print('%s say' %self.name) class People(Animal): x=10 #子类跟父类直接有冲突的时候以自己定义的为主 def __init__(self,name,age,sex,education): Animal.__init__(self,name,age,sex) #在这里写上父类的__init__ self.education=education #在这里定义上属于自己这个类自己的参数 peo1=People('小六',18,'male','运维总监') print(peo1.__dict__) print(peo1.x)
运行结果:
6.3 组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
代码示例:
#定义一个学校人员的类 class OldboyPeople: school = 'oldboy' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def eat(self): print('is eating') #定义一个学生类,继承学校人员父类 class OldboyStudent(OldboyPeople): def __init__(self,name,age,sex): OldboyPeople.__init__(self,name,age,sex) self.kencheng=[] def learn(self): print('%s is learning' %self.name) #定义一个老师类继承学校人员父类 class OldboyTeacher(OldboyPeople): def __init__(self,name,age,sex,salary,title): OldboyPeople.__init__(self,name,age,sex) self.salary=salary self.title=title self.kecheng=[] def teach(self): print('%s is teaching' %self.name) #定义一个课程类 class Kecheng: def __init__(self,kecheng_mingzi,kecheng_zhouqi,kecheng_qian): self.kecheng_mingzi=kecheng_mingzi self.kecheng_zhouqi=kecheng_zhouqi self.kecheng_qian=kecheng_qian def aa_info(self): print('课程名称:%s 课程周期:%s 课程价格:%s'%(self.kecheng_mingzi,self.kecheng_zhouqi,self.kecheng_qian)) #定义两个课程对象。 python=Kecheng('python','一个月',1000) linux=Kecheng('linux','一个月',9000) #定义一个老师对象t1 t1去选择课程。 t1=OldboyTeacher('egon',19,'男',11,'高级讲师') t1.kecheng.append(python) #往自己的对象中kecheng列表中添加,课程这个对象名称。 for i in t1.kecheng: i.aa_info() #直接通过课程对象名称找到对象类中定义的课程详情。 #定义一个学生对象s1 s1去选择课程。 s1=OldboyStudent('yxwang',19,'男') s1.kencheng.append(linux) for i in s1.kencheng: i.aa_info()
6.4 类中定义函数的两大分类
(1).绑定方法
绑定到类的方法:用classmethod装饰器的方法
类.boud_method(),自动将类当作第一个参数传入
绑定到对象的方法:没有被任何装饰器装饰的方法
对象.boud_method(),自动将对象当作第一个参数传入
(2)非绑定方法
用staticmethod装饰器装饰的方法。
不与类或对象绑定,类和对象都可调用。但是没有自动传值一说。就是个普通工具而已。
注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,
对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说
7.子类中调用父类中的方法的两种方式
(1),指名道姓法:(这种方法其实并不依赖继承关系,因为是直接指定类名去引用的)
class OldboyPeople: school = 'oldboy' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def eat(self): print('is eating') def teach(self): print('这是父类的teach') class OldboyTeacher(OldboyPeople): def __init__(self,name,age,sex,title): OldboyPeople.__init__(self,name,age,sex) self.title=title def teach(self): OldboyPeople.teach(self) print('%s is teaching' %self.name) egon_obj=OldboyTeacher('user01',18,'male','打酱油') egon_obj.teach()
(2)super方法
class OldboyPeople: school = 'oldboy' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def eat(self): print('is eating') def teach(self): print('这是父类的teach') class OldboyTeacher(OldboyPeople): def __init__(self,name,age,sex,title): # OldboyPeople.__init__(self,name,age,sex) #在Python2中需要写全:super(OldboyTeacher,self) super().__init__(name,age,sex) #使用super方法重用父类中的__init__方法 self.title=title def teach(self): # OldboyPeople.teach(self) super().teach() #使用super重用父类中的teach方法 print('%s is teaching' %self.name) egon_obj=OldboyTeacher('user01',18,'male','打酱油') egon_obj.teach()
两种方法使用哪一种都可以,但是最好不用混在一起用