oop(object oriented programming)
面向过程:根据业务逻辑从上到下写代码
类的组成
类的名称:类名
类的属性:一组数据
类的方法:允许对进行操作的方法(行为)
类:类是具有一组相同或者相似特征(属性)和行为(方法)的一系列对象的集合
对象:对象是类的实例化、具象化
类是对象的抽象化,而对象是类的一个实例
class 类名: 类名建议采用大驼峰方式命名
属性(对应特征)
方法(对应行为)
def
创建对象
对象名=类名()
调用函数
对象名.方法名()
实例方法:在类的内部,使用def关键字来定义,第一个参数默认是self(名字标识可以是其他名字,但位置必须被占用)
属性:在类的内部定义的变量(类属性)
在方法内部定义的通过类似于self.变量名定义的变量(实例属性)
init方法:初始化方法,实例化对象的时候自动调用,完成一些初始化设置,自带的内置函数,使用双下划线包起来的魔术方法magic,利用传参的机制可以让我们定义功能更加强大并且方便的类
self:
只有在类中定义实例方法的时候才有意义
在调用时不必传入相应的参数,而是由解释器自动去指向
self的名字是可以更改的
self指的是类实例对象本身,相当于java中this
str方法:直接打印对象,输出结果是一串类似id地址的信息,定义了str方法,在打印对象的时候,会执行str方法,str方法只能return字符串
new方法:创建对象实例的方法,每调用一次,就会生成一个新的对象
def new(cls,args,*kwargs):
return object.new(cls)
至少有一个参数是cls代表要实例化的类,实例化时由解释器自动提供
必须要返回该实例,否则对象就创建不成功
场景 :可以控制创建对象的一些属性限定,经常用来做单例模式的时候来使用
oop三大特征:封装、继承、多态
析构方法:当一个对象被删除或销毁时,默认调用del()析构方法,程序执行结束自动调用del()方法,来释放内存空间
封装:指的是把内容封装到某个地方,便于后面的使用
继承:子类可以继承父类的内容(属性和行为)
class 子类名(父类名): 无括号内容视为默认继承超类object,可以继承多个父类,有同名方法时,采用广度优先
mro:可以显示类的依次继承关系
重写:子类中若有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法,若父类和子类中都有init属性,则只会使用子类中的属性,但可以在子类的init中调用父类的init,父类名.init(self, ),父类名可用super()代替(不用加self)
多态:同一个行为对于不同的子类对象有不同的行为表现
优点:增加程序的灵活性和拓展性
鸭子类型(duck typing):动态类型的一种风格,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定,在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的
类属性和实例属性:类属性是可以被类对象和实例对象共同访问使用的,实例属性只能由实例对象所访问
类方法和静态方法:
类方法 用@classmethod进行修饰,可以被类对象和实例对象访问,第一个参数是类对象cls
静态方法 用@staticmethod进行表示,不需要任何参数(也可传参数),一般情况下,不会通过实例对象去访问静态方法
私有化属性:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问
1.私有化的实例属性,不能在外部直接的访问,可以在类的内部随意的使用
2.子类不能继承父类的私有化属性,只能继承父类公共的属性和行为
私有化方法:不允许外部调用,防止子类意外重写,在方法名前面加两个下划线,类内部调用,子类不能继承
单下划线、双下划线、头尾双下划线:
前面加一个下划线:以单下划线开头的表示的是protected类型的变量,即保护类型只能允许其本身与子类进行访问,不能使用from xx import *的方式导入
前后两个下划线:魔术方法,python自有,不要创建这种类型的方法
后面单下划线:避免属性名与python关键字冲突
外部调用私有属性的实现方法:
1.在类中定义值为property对象的类属性 类属性名=property(get获取属性值的方法,set设置属性值的方法)
2.在方法上使用装饰器
@property 用装饰器修饰,提供一个getter方法
def 属性名(self):
return
@属性名.setter 提供一个setter方法
def 属性名(self, ):
new方法:创建并返回一个实例对象,是在一个对象实例化的时候所调用的第一个方法,必须要有一个参数cls,代表要实例化的类。
默认结构:def new(cls,args,**kwargs):return super().new(cls,args,kwargs)
单例模式:一个类只有一个实例对象存在的一种软件设计模式,可以基于new去实现
def new(cls,*args,kwargs):
if not hasattr(cls,’instance’):#如果不存在就创建
cls.instance=super.__new(cls,args,*kwargs)
return cls._instance
错误与异常处理
try except:except根据具体的错误类型来捕获异常,Exception(可捕获所有类型异常)
语法格式
try:可能出错的代码块
except:出错之后执行的代码块(尽量去处理捕获到的错误)
else:没有出错的代码块
finally:不管有没有出错都执行的代码块
自定义异常类:由自定义一个异常类产生,要直接或间接继承Error或Exception类,由开发者主动抛出自定义异常,在python中使用raise关键字
动态添加实例方法:需要使用import types,利用types方法绑定实例属性 如cat.run=types.MethodType(run绑定的方法,cat绑定的对象)
给类绑定类方法和静态方法:使用方式:类名.方法名=xx
slots:限制class实例能添加的属性,只有在slots变量中的属性才能被添加,slots属性子类不会继承,只有在当前类中有效,子类中需要声明slots变量才能继承,格式:slots=(属性名的元组)。一般存储在实例中的属性都在dict中存储,定义了slots变量之后,存储在slots中。
call:def call(self,args,*kwargs): 将实例对象以函数的形式去调用