文章目录
- 面向对象三大特性
- 继承
- 派生
- 调用顺序
- 接口类
- 抽象类
- 继承顺序
- 封装
- public公有
- protected受保护
- privated私有
- 多态
面向对象三大特性
继承
1.继承是一种创建新类的方式
2.新建的类可以创建一个或多个父类,父类有称为基类或者超类
3.新建的类称为派生类或者子类
4.__base __只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
5.经典类:在python2中,class Dad: 不会继承object,这样的类叫做经典类
6.’新式类:在python3中,python会默认继承object类(一切皆对象)
派生
1.在父类的基础上产生子类,产生的子类就叫做派生类
2.父类里没有的方法,在子类中有了,这样的方法就叫做派生方法。
3.父类里有,子类也有的方法,就叫做方法的重写(就是把父类里的方法重写了)
调用顺序
1.子类可以使用父类的所有属性和方法
2.如果子类有自己的方法,就执行自己的;如果子类没有自己的方法,就会找父类的。
3.如果子类里面没有找到,父类里也没有找到,就会报错
4.如果子类中实现了调用父类的方法
在类内:super(子类,self).方法名() supper().__init__(参数)
在类外:super(子类名,对象名).方法名()
接口类
抽象出接口共同方法,子类必输实现,否则报错
from abc import abstractmethod, ABCMeta #接口类中定义了一些接口名:Pay,且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
class Payment(metaclass=ABCMeta): #抽象出的共同功能Pay
@abstractmethod
def pay(self,money):pass # 接口对象都需要有这个统一的方法,没有实例化就会报错
class Alipay(Payment):
def paying(self, money): #这里出现paying和我们规范的pay不一样,那么在实例化 Alipay的时候就会报错
print('支付宝支付了')
class Weicht(Payment):
def pay(self,money):
print('微信支付了')
def pay(pay_obj,money):
pay_obj.pay(money)
p=Alipay() # 实例化的时候就会报错 Can't instantiate abstract class Alipay with abstract methods pay
p=Weicht() # 不会报错
抽象类
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
import abc #利用abc模块实现抽象类
class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod #定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
pass
@abc.abstractmethod #定义抽象方法,无需实现功能
def write(self):
'子类必须定义写功能'
pass
# class Txt(All_file):
# pass
# t1=Txt() #报错,子类没有定义抽象方法
class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('文本数据的读取方法')
def write(self):
print('文本数据的读取方法')
class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('硬盘数据的读取方法')
def write(self):
print('硬盘数据的读取方法')
zzz=Txt()
rrr=Sata()
#这样大家都是被归一化了,也就是一切皆文件的思想
zzz.read()
rrr.write()
print(zzz.all_type)
print(rrr.all_type)
继承顺序
经典类深度优先;新式类广度优先
查询继承顺序 F.mro() #等同于F.__mro__
封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式。
public公有
这种其实就是不封装,是对外公开的
protected受保护
这种封装方式对外不公开,但对朋友或者子类公开
privated私有
双下划线表示私有
1.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果。
2.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的。
3.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。
多态
多态:同一类事物的多种状态
动物有多种形态:人,狗,猪