0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python类接口和抽象超类分析

jf_78858299 来源:梯阅线条 作者:小梯子 2023-04-06 15:07 次阅读

1.1 导入模块执行class语句

python导入模块时会执行class语句及主体内的顶层语句。

示例

# test.py
class MyClass:
   print('MyClass')
# cmd执行下面语句
E:\\documents\\F盘>python
>>> import test
MyClass

1.2 pytho类接口技术

python类接口技术通过继承实现。

# test.py
class Super:
   '''定义一个超类。
  定义一个method方法。
  定义一个delegate方法,方法内调用子类定义的action方法。
  '''
   def method(self):
       print('in Super.method')
   def delegate(self):
       '''调用子类定义的action'''
       self.action()
   
class Inheritor(Super):pass

class Replacer(Super):
   '''定义 Replacer 继承 Super
  替换超类的 method 方法
  '''
   def method(self):
       print('in Replacer.method')

class Extender(Super):
   '''定义 Extender 继承 Super
  调用超类的 method 方法, 并且进行扩展
  '''
   def method(self):
       print('Begin Extender.method')
       Super.method(self)
       print('End Extender.method')
       
class Provider(Super):
   '''定义 Provider 继承 Super
  实现超类 delegate 内调用的 action 方法
  '''
   def action(self):
       print('in Provider.action')
       
if __name__ == '__main__':
   for cls in (Inheritor,Replacer,Extender,Provider):
       print('\\n{}....'.format(cls.__name__))
       cls().method()
       
   print('\\nProvider')
   p = Provider()
   p.delegate()

''' 运行结果

E:\\documents\\F盘>python test.py

Inheritor....
in Super.method

Replacer....
in Replacer.method

Extender....
Begin Extender.method
in Super.method
End Extender.method

Provider....
in Super.method

Provider
in Provider.action
'''

1.3 python抽象超类

python类的部分行为由子类提供,则为抽象超类。

1.3.1 调用方法时触发提示

显式要求子类必须实现抽象超类的方法:

(1) 方法一,在超类方法用assert False

(2) 方法二,在超类方法用 raise NotImplementedError

未实现,则在实例调用方法时触发报错提示。

子类和超类都未提供方法 ,报 has no attribute

>>> class AbsSuper:
   def delegate(self):
       self.action()
       
>>> class Provider(AbsSuper):pass
>>> p=Provider()
>>> p.delegate()
Traceback (most recent call last):
 File ", line 1, in

在超类方法用assert False

>>> class AbsSuper:
   def delegate(self):
       self.action()
   def action(self):
       assert False,'子类必须定义 action'

       
>>> class Provider(AbsSuper):pass

>>> Provider().delegate()
Traceback (most recent call last):
 File ", line 1, in

在超类方法用raise NotImplementedError

>>> class AbsSuper:
   def delegate(self):
       self.action()
   def action(self):
       raise NotImplementedError('子类必须定义 action')
>>> class Provider(AbsSuper):pass

>>> Provider().delegate()
Traceback (most recent call last):
 File ", line 1, in

1.3.2 创建实例时触发提示

(1) 带有@abstractmethod修饰的方法为抽象方法。

(2) 带有抽象方法的类不能进行实例化。

(3) 超类有抽象方法时,子类必须重写超类的抽象方法。

(4) 未重写,则创建实例时触发报错提示。

抽象方法定义:

(1) python3:超类头部括号送metaclass**=**ABCMeta。

(2) python2:超类主体定义**metaclass****=**ABCMeta。

(3) 用@abstractmethod修饰方法。

python3示例

>>> from abc import ABCMeta,abstractmethod
>>> class MySuper(metaclass=ABCMeta):
   def delegate(self):
       self.action()
   # @abstractmethod 为抽象方法,子类必须重写
   @abstractmethod
   def action(self):
       pass  # 抽象方法在父类通常留空,用pass进行占位

   
>>> ms=MySuper()
Traceback (most recent call last):
 File "
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口技术
    +关注

    关注

    1

    文章

    273

    浏览量

    41347
  • Class
    +关注

    关注

    0

    文章

    53

    浏览量

    19714
  • python
    +关注

    关注

    56

    文章

    4783

    浏览量

    84475
收藏 人收藏

    评论

    相关推荐

    如何使用Python? 优势有哪些?

      Python是一种面向对象的高级语言,因此类对于Python非常重要。是一个空间,在该空间中变量(属性/方法)分别存储。运算符' . '用于调用的属性和方法。
    发表于 07-30 18:08

    python的理解与使用

    python的理解与使用1. 通俗理解(英文名 class),是具有相同特性(属性)和行为(方法)的对象(实例)的抽象模板。从定义上来
    发表于 03-07 16:51

    JAVA语言的抽象封装与

    JAVA语言的抽象封装与5.1 抽象与封装5.2 Java的5.3 的修饰符5.4 域5.5 方法5.6 访问控制符面向对象的程序设计
    发表于 12-14 20:33 45次下载

    抽象类接口的区别及用法

    接口只能包含方法声明,而抽象类还可以包含方法的定义。
    发表于 12-28 14:34 1590次阅读

    《Visual C# 2005开发技术》抽象类、多态及接口

    《Visual C# 2005开发技术》抽象类、多态及接口
    发表于 02-07 15:17 0次下载

    分析java接口抽象类区别

    一。抽象类 二。接口 三。抽象类接口的区别 一。抽象类 在了解抽象类之前,先来了解一下
    发表于 09-27 16:40 0次下载

    python的理解与使用

    python的理解与使用 1. 通俗理解 (英文名 class),是具有相同特性(属性)和行为(方法)的对象(实例)的抽象模板。 从定
    的头像 发表于 03-07 16:51 1544次阅读

    Python继承的基本规则

    继承规则 与其他基于的语言一样,可以通过继承组合多个定义。 定义可以扩展(或继承)多个其他。这些又可以扩展其他
    的头像 发表于 09-20 14:24 502次阅读

    java接口抽象类的区别

    Java中的接口(Interface)和抽象类(Abstract class)都是抽象的概念,它们可以用来定义的行为和特征。虽然它们具有一些相似之处,但也存在一些重要的区别。本文将详
    的头像 发表于 11-21 09:45 505次阅读

    Java中抽象类接口的介绍

    Java是一种面向对象的编程语言,提供了抽象类接口两种机制来帮助开发人员组织和管理代码。本文将详细介绍Java语言中抽象类接口的概念、特点、使用方式以及它们之间的区别和联系。
    的头像 发表于 11-21 09:47 439次阅读

    抽象类可以实现接口

    抽象类是一种特殊的,在面向对象编程中起到了很重要的作用。同时,接口也是面向对象编程中的一个重要概念,用于定义的契约和行为。抽象类
    的头像 发表于 11-21 09:49 1180次阅读

    java接口是特殊的抽象类

    Java接口是一种特殊的抽象类吗? 在Java编程语言中,接口(interface)与抽象类(abstract class)是两种不同的概念,尽管它们之间存在一些相似之处,但在设计和使
    的头像 发表于 11-21 10:07 597次阅读

    如何理解java中的抽象类

    Java中的抽象类是一种特殊的,无法被实例化,只能被继承。它是一个中间层的,位于具体接口之间,用于定义通用的属性和方法,并提供一些默
    的头像 发表于 11-21 10:16 568次阅读

    java抽象类可以有普通方法吗

    Java中的抽象类可以有普通方法,但它也可以有抽象方法。抽象类是一种中间状态,介于普通接口之间。它允许定义方法的具体实现,同时也可以定义
    的头像 发表于 11-21 10:22 1496次阅读

    java抽象类可以有构造函数吗

    Java 中,抽象类是一种不能直接实例化的,它通常用作其他的父接口的实现
    的头像 发表于 11-21 10:23 853次阅读