首页 > 编程语言 >python面向对象三大特性(继承、多态、封装)之继承

python面向对象三大特性(继承、多态、封装)之继承

时间:2024-07-22 17:21:52浏览次数:7  
标签:name 继承 self 多态 python print eat def

来吧,下面来具体说一下面向对象的三大特性:所谓封装、多态和继承。我们先来说一下继承。
所谓继承,顾名思义,子类继承父类的属性,包括数据属性和函数属性。写个简单的例子吧:
1.简单的继承

class Animal:
    need_substance = 'water'
    def __init__(self):
          print('这是一个动物类')
    def eat(self):
          print('动物都需要吃东西')

class Dog(Animal):
    def __init__(self,name,age):
          self.name=name
          self.age=age
    

d1 = Dog('小黑',5) #实例化一个对象:小黑
print(d1.need_substance) #输出结果:water
d1.eat() #输出结果:动物都需要吃东西

2.重写父类方法
上面是一个简单的继承的例子,下面看一个关于重写父类方法的例子:

class Animal:
    need_substance = 'water'
    def __init__(self):
        print('这是一个动物类')
    def eat(self):
        print('动物都需要吃东西')

class Dog(Animal):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def eat(self,food): #重写父类的eat方法,但是并没有影响父类的eat方法,只是对象在调用的时候优先调用自己的方法,这是一个作用域的问题。
        print('%s喜欢吃%s' %(self.name,food))

d1 = Dog('小黑',5)
d1.eat('肉')

3、类方法
类方法,顾名思义就是专门用类名直接调用的方法,不需要实例化一个对象就可以直接使用。当然了,实例化一个对象后也可以调用。
直接上代码,仔细体会其中的思想。

class Animal:
    need_substance = 'water'
    @classmethod
    def sum(cls,x,y):
        return x+y

class Dog(Animal):
    def __init__(self,name):
        self.name=name

print(Animal.sum(2,3))
print(Animal.need_substance)
print('-----------------')
a = Animal()
print(a.sum(2,3))
print(a.need_substance)
print('-----------------')
d = Dog('小黑')
print(d.sum(2,3))
print(d.name)
print(d.need_substance)

输出结果:
D:\python\python.exe D:/python/project/file_exec.py
5
water
-----------------
5
water
-----------------
5
小黑
water

Process finished with exit code 0

4、静态方法

直接上代码:
class Animal:
    need_substance = 'water'
    @classmethod
    def sum(cls,x,y):
        return x+y
    @staticmethod
    def eat():
        print('动物都需要吃东西')

class Dog(Animal):
    def __init__(self,name):
        self.name=name

Animal.eat()
print('---------------')
a = Animal()
a.eat()
print('---------------')
d = Dog('小黑')
d.eat()

输出结果:
D:\python\python.exe D:/python/project/file_exec.py
动物都需要吃东西
---------------
动物都需要吃东西
---------------
动物都需要吃东西

Process finished with exit code 0

5、真正的继承 --这才是大招
其实上面这些都谈不上真正的继承,真正的继承应该是有一个父类,比如父类有两个方法,那么严格限定子类也必须有这两个方法。

来个代码示例:
import abc
#定义一个基类
class Cat(metaclass=abc.ABCMeta):
    need_substance = 'water'
    @abc.abstractmethod
    def eat(self):
        print('猫都喜欢吃鱼')
    @abc.abstractmethod
    def catch_mice(self):
        print('猫都擅长抓老鼠')

#定义一个加菲猫
class Garfield(Cat):
    pass

g = Garfield()

输出结果:
D:\python\python.exe D:/python/project/file_exec.py
Traceback (most recent call last):
  File "D:/python/project/file_exec.py", line 16, in <module>
    g = Garfield()
TypeError: Can't instantiate abstract class Garfield with abstract methods catch_mice, eat

Process finished with exit code 1

呦呵,报错了。上面的报错什么意思呀?看TypeError后面的内容,提示缺少catch_mice, eat这两个方法。
来吧,下面改写下上面这段代码:

import abc
#定义一个基类
class Cat(metaclass=abc.ABCMeta):
    need_substance = 'water'
    @abc.abstractmethod
    def eat(self):
        print('猫都喜欢吃鱼')
    @abc.abstractmethod
    def catch_mice(self):
        print('猫都擅长抓老鼠')

#定义一个加菲猫
class Garfield(Cat):
    def __init__(self,name):
        self.name=name
    def eat(self):
        print('%s除了喜欢吃鱼,还喜欢吃老鼠' %self.name)
    def catch_mice(self):
        super().catch_mice()

g = Garfield('加菲猫')
g.eat()
g.catch_mice()

输出结果:
D:\python\python.exe D:/python/project/file_exec.py
加菲猫除了喜欢吃鱼,还喜欢吃老鼠
猫都擅长抓老鼠

Process finished with exit code 0

标签:name,继承,self,多态,python,print,eat,def
From: https://www.cnblogs.com/kkbest/p/18315344

相关文章

  • 7月22号python 每日一题
    7月22号python每日一题LCR121.寻找目标值-二维数组难度:中等m*n的二维数组plants记录了园林景观的植物排布情况,具有以下特性:每行中,每棵植物的右侧相邻植物不矮于该植物;每列中,每棵植物的下侧相邻植物不矮于该植物。请判断plants中是否存在目标高度值target。示......
  • Python文件夹与文件逐级移动
    importosimportshutildefmove_items(src_path,dest_path):  #列出源路径下的所有项  items=os.listdir(src_path)  foritem_nameinitems:    src_item=os.path.join(src_path,item_name)    #构造目标路径    dest_i......
  • python解释器源码函数调用分析
    1、编译python代码1.1python代码test.py1defftest():2x=33ftest()1.2编译工具disass_py.py#-*-coding:utf8-*-importdisimportsysdefdisassemble_file(file_path):withopen(file_path,'r')asfile:source_code=file.read()......
  • python学习笔记——基础数据类型
    一、python赋初值         1.Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。    2.在Python中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。    3.等号(=)用来给变量赋值。 ......
  • Python数据可视化常用的库
    Python中的数据可视化是指使用图形和图表来展示数据,以便更直观地理解和分析数据。数据可视化的目的是将复杂的数据转化为容易理解的视觉形式,从而帮助发现数据中的模式、趋势和异常情况。以下是数据可视化的一些主要用途:探索性数据分析:帮助理解数据分布和结构识别数据中的......
  • 张高兴的 MicroPython 入门指南:(三)使用串口通信
    目录什么是串口使用方法使用板载串口相互通信硬件需求电路代码使用板载的USB串口参考什么是串口串口是串行接口的简称,这是一个非常大的概念,在嵌入式中串口通常指UART(UniversalAsynchronousReceiver/Transmitter,通用异步收发器)。使用串口进行的通信叫做串行通信,与之相对的一......
  • 如何使用 Python 自动反转 .cal 和 .GP4 图像文件中的颜色?
    我在.cal和.GP4中有数千个计划,我需要反转其颜色(当它们处于“负”时切换到“正”模式)。我知道可以在像autocad这样的软件中一一完成,但出于明显节省时间的原因,我正在寻找一种批量处理方法。我创建了一个Python程序来执行该操作,但先验有没有允许轻松操作.cal和.GP4......
  • 写一个 python daemo 注册到nacos中
     """注册到nacos中的deamonnacos:2.3.2(模式:standalone)python:3.6.8nohuppython3demon.py&"""importrequestsimportthreadingimporttime#Nacos服务器地址和端口nacos_url="http://127.0.0.1:8848"#Nacos登录信息user......
  • Python、图形用户界面、ctk
    所以,我正在创建一个博客,现在,我在设置部分,我有一个带有按钮的滑动面板,我希望它转到一个新窗口,我将在其中创建新的小部件等...,我已经完成了这种登录和注册的事情,问题是现在我不能使用pack.forget(),它只是不起作用classSlidePanel(customtkinter.CTkFrame):def__init__(se......
  • 当我的代码损坏时,如何设置警报或蜂鸣声? (最好是Python)
    我正在为机器人运行一些代码,它将继续运行,直到我手动终止该进程。或者,如果代码意外遇到诸如SYntaxError或其他此类错误/异常之类的错误并崩溃。我想知道当我的代码崩溃时是否可以设置一些警报或蜂鸣声。我的目标就是将视线从屏幕上移开,仅在进程停止运行时才检查它。如果......