Python面向对象编程
首先明白面向过程和面向对象概念
面向过程:根据业务逻辑从上到下书写代码
面向对象:将数据与函数绑定在一起,进行封装,加速开发过程,减少重复代码的书写
类:具有相同或相似属性和行为的事物的集合,类是抽象的
对象:在现实生活中真实存在的物体,看得见摸得到
属性:事物的特征信息,静态数据
方法:事物能进行的活动,能对静态数据做的操作,是动态的
封装
封装:
1.把数据和方法组合到一起,写到类中;
2.把类中不需要对外暴露的属性和方法隐藏起来;
3.把代码块写到方法中,当别人调用这个方法时,只需要知道这个方法的作用(功能),不需要知道具体的实现细节。
封装的好处:
对外暴露功能,隐藏了功能实现的细节,可以提高开发效率
几个重要的魔法方法:
__new__方法
这个方法是用来创建空白对象的
当创建对象时,python解释器会自动调用这个方法创建一个空白对象,并返回该空白对象
通过调用object类中的__new__方法创建对象,创建出来的是一个空白对象然后返回
def __new__(cls,*args,**kwargs): # *args用来接收创建对象时传来的参数,后面会解包传给__init__方法
return super().__new__(cls) # cls是来接受类对象的,告诉解释器创建那个类的空白对象
#return object().__new__(cls)
def __init__(self,name,age):
self.name = name
self.age = age
__init__构造函数
在对象创建之后,解释器会立即调用这个方法,会把对象传递给self,
把Student("王二",30,"男")中的三个参数值传递给new_name,new_age,new_gender。
__str__
必须返回一个字符串,常用来返回对象的属性和属性值拼接的一个字符串
两种情况下会调用__str__方法:
1.打印对象时,解释器会自动调用str方法,得到一个字符串
2.将对象转成字符串时,也会得到一个字符串
__del__ 析构函数
在对象即将被销毁的时候(对象的引用为0),解释器自动调用这个方法
作用:
不是删除对象,__del__并没有删除对象的功能,是用来交代被销毁前的要做的事。
调用对象的方法时,该方法的参数可以是另一个类的对象,可以直接调用另一个对象的属性和方法,十分方便有用。
继承
继承:子类继承父类,子类一旦继承父类,就拥有了父类中非私有的属性和方法。
继承的好处:
1.扩展子类的功能
2.减少重复代码的书写,提高代码的复用性
私有属性和私有方法
私有属性:self.__属性名 = 属性值
私有方法:
def __方法名(形参):
pass
子类不能继承父类的私有属性和私有方法,子类对象和父类对象不能在类外使用私有,私有只能在类内使用。
若想在类外使用私有,可在类内定义公共方法获取或修改私有。
python其实不存在绝对的私有,更多关于私有的知识后续再来补充。
python中继承可以分为:
单继承:父类继承的是object类,子类继承父类。
多继承:同时继承多个父类,括号内的第一个父类为直接父类,super就是直接父类中的标记。
多层继承:一层一层的继承,父类继承父类的父类,子类继承父类。
子类可以重写父类方法,若想使用被重写的父类方法,有三种方式:
1.父类名.方法名(self,形参值的列表) # self 的作用是将子类传入,告诉父类是哪个子类在调用父类的方法
2.super(子类名,self).方法名(形参值的列表)
3.super().方法名(形参值的列表) # super()其实代表的就是直接父类,即使用直接父类中的方法
实例属性
对象的属性,实例属性和实例属性值存储在实例对象中
如何访问修改实例属性:
1.类内:
对象名.实例属性名 = 新值 # self.name = new
2.类外:
对象名.实例属性名 = 新值 # s1.name =new
实例方法
对象的方法,实例方法存储在类对象中
如何调用实例方法:
1.类内:
对象名.实例方法名 self.study()
2.类外:
对象名.实例方法名 s1.study()
类对象
class A():
类体
称为一个类对象,type类包括所有的类对象,type类被叫做类的类
类属性
所有的对象共享公用的属性,这个属性不专属于某一个对象,是所有对象共用的
类似C++里的静态成员变量。
如何访问类属性:
类内:
1.类名.类属性名
2.对象名.类属性名 # self.类属性名
类外:
1.类名.类属性名
2.对象名.类属性名 # s1.类属性名
如何修改类属性名:
类名.类属性名 = 修改后的值
不能通过 对象名.类属性名 = 修改后的值 ,这是给对象添加实例属性
类方法
class Student(object):
@classmethod
def close(cls,name):
print(cls)
print(name)
cls.test()
@classmethod
def test(cls)
print("test")
方法中的cls参数值接收的是当前的类对象,就是Student
在类方法中无法直接调用实例属性和实例方法,因为无法得到self
如何调用类方法:
类内:
1.self.close("王五") # 对象名.类方法名(实参)
2.Student.close("王五") # 类名.类方法名(实参)
类外:
1.s1.close("王五") # 对象名.类方法名(实参)
2.Student.close("王五") # 类名.类方法名(实参)
静态方法
@staticmethod
def show()
print(Student.air_condition)
Student.close("王五")
静态方法,可没有形参,根据需求定。
如何调用静态方法:
1.类内
1.对象名.静态方法名
2.类名.静态方法名
2.类外:
1.对象名.静态方法名
2.类名.静态方法名
单例模式
单例模式是一种设计模式,为了解决某一类问题而设计出来的一个方案
单例:
在系统中这个类只有一个实例对象,不管创建对象创建了几次,在系统中只有一个对象
多态
python的多态是鸭子类型:
Python 的多态就是 弱化类型,重点在于对象参数是否有指定的属性和方法
如果有就认为合适,而不关心对象的类型是否正确 。
异常的概述
异常:执行程序时程序抛出的红色信息
异常类是用来描述某一类异常的
程序中出现的异常需要处理,不然会影响后续代码的执行
异常的传递 :向上抛出异常
解释器处理异常的原理
1.程序执行到报错代码时,解释器根据错误原因,查找相对应的异常类,
然后创建一个异常类对象,最后把异常对象向外抛出
2.这个异常对象抛给了代码的调用者,谁调用了这段代码,解释器就会把异常对象抛给谁,调用者来处理异常。
3.如果调用者是解释器自己,需要解释器自己来处理异常
4.解释器如何处理异常:
把异常信息打印到来控制台
终止程序的运行
异常的定义格式
处理异常的格式:
try:
可能会出现异常的代码块
except:
处理异常的代码块
finally:
print("有无异常,该语句都要执行")
自定义异常
自定义异常类:
1.继承父类
2.重写__init__方法
class AgeError(Exception): # 继承父类
def __init__(self,msg): # 重写__init__方法
self.msg = msg
class Student:
def __init__(self,name,age):
self.name = name
self.__age = age
def set_age(self,age):
if 0<age<150:
self.__age = age
else:
raise AgeError("年龄必须在0到150之间...") # 抛出年龄错误的异常
s = Student("王二",15)
try:
s.set_age(200)
except AgeError as e:
print(e)