面向对象2:之抽象基类:import abc,metaclass=abc.ABCMeta

Recently 祝祝于 2021-03-10 16:29:49 发布

实时分享:今天学了Python的抽象基类,发现了这个,一看what,一脸懵啊。

当时有点懵,之前只是了解或觉得Python的库很多,没想到出现了一个abc 我还以为是老师打错了,没想到还真的有,了解了一下,做个笔记有助于理解与学习:

 很多时候我们抽象一个基类,只是知道了需要有哪些方法,但是只是抽象方法,并不能完全实现想要的功能,只能继承,但是抽象后父类不能被实例化,这时子类必须实现这些功能

基类理解:
metaclass是“类的类”,秉承Python“一切皆对象”的理念,Python中的类也是一类对象,metaclass的实例就是类(class),自己写metaclass时需要让其继承自type对象。关于metaclass的介绍,“主要资源”中相关的链接,不做赘述。

ABC(抽象基类),主要定义了基本类和最基本的抽象方法,可以为子类定义共有的API,不需要具体实现。

abc模块,Python 对于ABC的支持模块,定义了一个特殊的metaclass—— ABCMeta 还有一些装饰器—— @abstractmethod 和 @abstarctproperty 。

abc.ABCMeta 是一个metaclass,用于在Python程序中创建抽象基类。

抽象基类可以不实现具体的方法(当然也可以实现,只不过子类如果想调用抽象基类中定义的接口需要使用super())而是将其留给派生类实现。抽象基类可以被子类直接继承,也可以将其他的类”注册“(register)到其门下当虚拟子类,虚拟子类的好处是你实现的第三方子类不需要直接继承自基类但是仍然可以声称自己子类中的方法实现了基类规定的接口(issubclass(), issubinstance())!

虚拟子类是通过调用metaclass是 abc.ABCMeta 的抽象基类的 register 方法注册到抽象基类门下的,可以实现抽象基类中的部分API接口,也可以根本不实现,但是issubclass(), issubinstance()进行判断时仍然返回真值。

直接继承抽象基类的子类就没有这么灵活,在metaclass是 abc.ABCMeta的抽象基类中可以声明”抽象方法“和“抽象属性”,直接继承自抽象基类的子类虽然判断issubclass()时为真,但只有完全覆写(实现)了抽象基类中的“抽象”内容后,才能被实例化,而通过注册的虚拟子类则不受此影响。

metaclass为 abc.ABCMeta 的抽象基类如果想要声明“抽象方法”,可以使用abc模块中的装饰器 @abstractmethod ,如果想声明“抽象属性”,可以使用abc模块中的 @abstractproperty 。

Any way:说到这里重点来了:一般重点都喜欢概括成一句话:
在python中我们视类为对象,so,metaclasses就是来创建对象的。它们是类的类
over,是不是感觉一句话简单多了,然后他有自己的抽象方法,在使用过程中,子类必须要实现父类的方法,so what 他就是抽象,亦为接口。over,收工

  1. """
  2. 三个类:人,狗,猪
  3. 抽象类不能被实例化
  4. """
  5. import abc
  6. class Animal(metaclass=abc.ABCMeta):
  7.     all_type="animal"
  8.     @abc.abstractmethod
  9.     def run(self):
  10.         pass
  11.     @abc.abstractmethod
  12.     def eat(self):
  13.         pass
  14.     
  15. # a=Animal()会报错,抽象类不能被实例化
  16. class People(Animal):
  17.     def run(self):
  18.         print('people is running')
  19.     def eat(self):
  20.         print('people is eating')
  21. class  Pig(Animal):
  22.     def run(self):
  23.         print("Pig is running")
  24.     def eat(self):
  25.         print('Pig is eating')
  26. class Dog(Animal):
  27.     def run(self):
  28.         print("Dog is running")
  29.     def eat(self):
  30.         print('Dog is eating')
  31. peo1=People()
  32. pig1=Pig()
  33. dog1=Dog()
  34. peo1.eat()
  35. pig1.eat()
  36. dog1.eat()

实验结果:

 

好处:归一化
顾名思义:就是子类里都要实现父类的功能
相当于,比如说抽象类,就相当于女娲造人,abc用来强调,这个人必须有手、脚等等
————————————————
版权声明:本文为CSDN博主「Recently 祝祝」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45656077/article/details/114637965

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值