首页 > 其他分享 >面向对象之抽象类

面向对象之抽象类

时间:2024-01-29 14:58:26浏览次数:27  
标签:__ name self 接口 面向对象 抽象类 def

面向对象之抽象类

一、接口与抽象类

[1]什么是接口

  • 因为Python中没有具体的接口概念我们以Java中的接口来对接口进行解释:我们以IAnimal.java(动物类)为例
  • Java的Interface接口的特征
    • 是一组功能的集合,而不是一个功能
    • 接口的功能用于交互,所有的功能都是public,即别的对象可操作
    • 接口只定义函数,但不涉及函数实现
    • 这些功能是相关的,都是动物相关的功能,但光合作用就不适宜放到IAnimal.java里面了
  • 简单来讲接口就是自己提供给使用者来调用自己功能的方式\方法\入口

[2]为什么要用接口

  • 接口提取了一群类共同的函数,可以把接口当做一个函数的集合,方便让子类去实现接口中的函数。
  • 使用接口的意义在于归一化:只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。
  • 归一化的好处:
    • 归一化让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度
    • 归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合

[3]接口与抽象类

  • Python中为了模仿接口定义的接口类,这些接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
  • 向上述这样的接口类,只能被子类继承来使用其中的功能接口,而不能被实例化接口,就用到了抽象类
# 定义接口MouseInterface类来模仿接口的概念
class MouseInterface:
    # 定接口函数read
    def click(self):
        ...

    # 定义接口函数write
    def move(self):
        ...


# 罗技品牌的鼠标可以实现点击和移动功能
class LogitechMouse(MouseInterface):
    def click(self):
        ...

    def move(self):
        ...

# 雷蛇品牌的鼠标也可以实现点击和移动功能
class RazerMouse(MouseInterface):
    def click(self):
        ...

    def move(self):
        ...

  • 抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
  • 抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计

二、抽象类详解

  • 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
  • 抽象类的实现:与java一样,python也有抽象类的概念但是同样需要借助模块实现
#导入模块来实现抽象类
import abc


# 模仿定义接口类
# 需要在定义接口类时将参数metaclass设置为abc.ABCMeta
class AnimalInterface(object, metaclass=abc.ABCMeta):
    def __init__(self, name):
        self.name = name
	
    # 在子类必须实现的功能上放添加修饰器语法糖
    @abc.abstractmethod
    def eat(self):
        print(f'{self.name}需要进食!')
        
	# 在子类必须实现的功能上放添加修饰器语法糖
    @abc.abstractmethod
    def excretion(self):
        print(f'{self.name}需要排泄!')

# 只要继承了接口类就必选实现带有语法糖修饰的功能
class Duck(AnimalInterface):
    def __init__(self, name):
        super().__init__(name)
        self.name = name

    def eat(self):
        print(f'{self.name}需要进食!')

    def excretion(self):
        print(f'{self.name}需要排泄!')


class Mouse(AnimalInterface):
    def __init__(self, name):
        super().__init__(name)
        self.name = name

    def eat(self):
        print(f'{self.name}需要进食!')

    def excretion(self):
        print(f'{self.name}需要排泄!')


tang_duck = Duck('tang_duck')
tang_duck.eat()  # tang_duck需要进食!
tang_duck.excretion()  # tang_duck需要排泄!

mickey = Mouse('mickey')
mickey.eat()  # mickey需要进食!
mickey.excretion()  # mickey需要排泄!

标签:__,name,self,接口,面向对象,抽象类,def
From: https://www.cnblogs.com/taoyuanshi/p/17994494

相关文章

  • 面向对象之元类
    面向对象之元类一、什么是元类产生已知类的类就叫做元类,typeclassPerson(object):...deffunc():...people=Person()#产生对象的是类print(type(people))#<class'__main__.Person'>print(type(func))#<class'function'>#产生类的就是元类p......
  • 面向对象之内置方法
    面向对象之内置方法​Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发__init__ :初始化类时触发__del__ :删除类时触发__new__ :构造类时触发__str__ :str函数或者print函数触发__......
  • 面向对象之派生和组合
    面向对象之派生和组合派生派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法一、派生的方法子类是必须要派生出自己的数据属性不然就无数据属性可用子类无法使用父类中__init__定义的属性classPerson(object):def__init__(self,name,age......
  • 面向对象基础 成员变量、成员方法、构造方法、this关键字、静态字段、静态方法..
    成员变量与局部变量的区别:  1.作用域:成员变量作用于整个类,局部变量只作用于它所属的范围(函数、语句)  2.生命周期&位置:成员变量存储在堆内存中,是属于对象的,随着对象存在消失。局部变量存储在栈内存中,是属于他所属的范围的,使用完自动释放。  3.初始值:成员变量有默认初始......
  • day01-面向对象高级
    day01——面向对象高级各位同学,接下来的三天课程中,我们继续学习面向对象的相关课程。面向对象是写Java程序的核心套路,如何你不懂面向对象,那就相当于Java你白学了。所以在接下来的三天时间里,各位同学也需要克服重重困难好好学习。前面我们说过面向对象最核心的套路是:设计对象来处......
  • C# 面向对象编程进阶:构造函数详解与访问修饰符应用
    C#构造函数构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:示例获取您自己的C#服务器创建一个构造函数://创建一个Car类classCar{publicstringmodel;//创建一个字段//为Car类创建一个......
  • 1.接口和抽象类的区别
    接口(interface)和抽象类(abstractclass)是支持抽象类定义的两种机制。具体而言,接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的。而抽象类是可以有私有方法或私有变量的,如果一个类中包含抽象方法,那么这个类就是抽象类。在java语言中,可以通过把类或者类中的某些方法......
  • C# 面向对象编程进阶:构造函数详解与访问修饰符应用
    C#构造函数构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值:示例获取您自己的C#服务器创建一个构造函数://创建一个Car类classCar{publicstringmodel;//创建一个字段//为Car类创建一......
  • 33抽象类
    抽象类抽象类的初衷给出共性属性,让派生类通过继承直接复用这些属性给所有的派生类保留统一的覆盖/重写接口抽象类拥有纯虚函数func(para)=0的类,叫做抽象类抽象类不可以直接实例化对象,但可以定义指针和引用变量#include<iostream>usingnamespacestd;#include<stri......
  • 理论篇:面向对象程序设计指导
    》本文来自看过的相关知识的摘录整理,太久了,忘了主要出自哪儿里了。软件架构架构(Architecture)是指一个系统或软件的总体设计和组织结构,包括其各个组件、模块、接口和数据流等。架构设计的目的是确保系统或软件具有可扩展性、可维护性、可靠性和安全性等特性,并且能够满足业务需......