类的总复习
类
类指的是一系列对象相同的特征与技能的结合体
如何定义类
先抽象,抽取对象之间相同的特征与技能
再定义,
定义类时会发生那些事情
1.会产生一个类的名称空间
2.会把类内部的多有名字,扔进该名称空间内
注意:定义类时,就会执行类内部的代码,若语法不正确,则会报错
如何产生对象
调用类会产生一个对象,调用类的过程称之为类的实例化,对象称之为类的一个实例
调用类时发生的事情
1.调用类时会产生一个对象的名称空间
2.会触发__init__,接着把对象与括号内所有的参数都传给__init__(),对象当作第一个参数
3.在__init__内部没有,可以给对象添加属性
对象的名字查找
1先找对象自己有没有,
2.没有就去类中找
3.若此类是子类,会去父类中查找。
对象的绑定方法
类来调用,类内部的方法只是普通的函数,函数需要几个参数,就传入几个参数。
由对象由来调用,会自动把对象当作第一个参数传入该方法。
注意:不同对象的对象调用该绑定方法,会将不同的对象传入该绑定方法中
一切皆对象
在python中,一切皆对象
python八大数据类型
list, tuple, set, dict, float, int, bool, str
内置函数:filter
继承
继承指的是新建类的方式,新建的类指的是子类或派生类,子类可以继承一个父类,父类又可以称之为基类或超类
如何查找继承关系
必须 ”先抽象,再继承“
抽象:抽取相似的部分
—先抽象:抽取类与类之间相同的特征与技能
—再继承:确定好子类与父类,定义父类,父类中写类与类之间相同的特征与技能,子类继承父类的属性
继承关系
类是对象与对象之间的关系,类是一系列对象相同的特征与技能的结合体
继承是类与类之间的关系,子类与父类是一种从属关系
派生
派生指的是子类继承父类的属性,并派生出自己的属性
子类可以派生出自己的属性,并重用父类的属性
1.__init__直接调用类,类名.属性的方式冲重用父类的属性
2.super(),super().指向父类的名称空间,重用父类的属性
注意:子类派生出与父类相同的属性,以子类为主
在继承背景下,对象属性的查找顺序
1.先在对象中查找
2.对象中没有,在类中查找
3.类中没有,若类为子类,会在父类中查找
4.对象查找属性,若子类有,不管父类有没有,以子类为准
新式类与经典类
新式类:继承object的类
经典类:在python2中没有继承object的类
钻石继承(菱形继承)
新式类:广度优先
经典类:深度优先
组合
组合指的是一个对象的属性是另一个对象
组合的作用:与继承一样,解决代码冗余问问题
继承的优点:编写的复杂程度没有组合高
继承的缺点:耦合度太高,可扩展性差
组合的优点:可以让类与类之间耦合,可扩展性高
组合的缺点:编写复杂程度高于继承
封装
封装指的是把一堆属性,封装到对象中,对象就好比一个袋子,或一个容器
优点:方便数据的存取,可以通过 对象.属性 的方法获取数据
封装是面向对象的核心
访问限制机制
在类内部,凡是以__开头的属性,都会被隐藏,实际是变形成为 __类名__ 属性
好处:可以对一些重要的数据进行隐藏,不轻易被直接调用,保证数据的安全,比如与金钱,用户信息相关的操作
property
python的内置的装饰器,主要给类内部的方法使用,使用他的目的是将类内部的方法(def方法名)变成了(def方法)
注意:不能对被装饰过的方法属性修改
多态
同一种事物的多种形态
多态的目的:是为了统一代码的编写规范
多态的实现方式:
继承:子类继承父类的特征
抽象类:
1.导入一个abc模块
2.让父类继承一个(metaclass=abc.ABCMeta)
3.给类内部所有方法加上一个@abc.abstractmethod
子类继承抽象类,强制让子类继承父类的方法,缺一不可
鸭子类型:
只要你长得像鸭子,并且行为与鸭子一摸一样,呢么你就是鸭子
同一种事物的类,都有相同的功能,该这些类都在内部定义相同名称的方法
classmethod
是一个方法,用来装饰在类内部的方法,可以让该方法变成类的绑定方法
对象的绑定方法:由对象来调用,会将对象当作第一个参数传入该方法,不同的对象调用该方法,则会将不同的对象传入到该绑定方法中
类的绑定方法:由类来调用,会将类当作第一个参数传入该方法。
staticmethod
是一个装饰器,可以装饰类内部的方法,使该方法既不绑定给对象,也不绑定给类,谁都可以调用,并且没有自动传值的效果
简而言之,非绑定方法就是将普通方法放到类中使用
面向对象高级
isinstance
判断一个对象是不是另一个类的实例
issubclass
判断一个类是不是另一个类的子类
反射
反射:通过字符串操作对象或类的属性
hasattr:通过字符串,判断字符串是否是一个对象或类的属性
getattr:通过字符串,获取对象的属性
setattr:通过字符串,设置对象的属性
delattr:通过字符串删除一个对象或类的属性
魔法方法
__new__ 会在__init__执行前触发
__init__ 会在类被调用的时候触发
__str__ 会在打印的时候触发
__getattr__ 会在对象.属性时,属性没有的时候触发
__setattr__ 会在 对象.属性 = 属性值 的时候触发
__del__ 会在对象被注销前执行,该方法会在最后执行
__call__ 会在对象被调用的时候触发