文章目录

  • 面向对象三大特性
  • 继承
  • 派生
  • 调用顺序
  • 接口类
  • 抽象类
  • 继承顺序
  • 封装
  • 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,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。

多态

多态:同一类事物的多种状态
动物有多种形态:人,狗,猪