首页 > 编程语言 > python 封装 多态 继承 重写

python 封装 多态 继承 重写

时间:2022-10-30 00:24:49浏览次数:38  
标签:__ info name python 子类 self 多态 重写 def

面向对象的三大特征

  • 封装:提高程序的安全性

  • 继承:提高代码的复用性(继承包括重写)

  • 多态:提高程序的可扩展性和可维护性

 

三大特征的实现:

  • 封装:将数据(属性)和行为(方法)包装到类对象

  • 中继承:单继承、多继承

  1. 如果一个类没有继承任何类,则默认继承object
  2. 定义子类时,必须在其结构函数中调用父类的构造函数(表示继承父类的构造函数)
  • 方法重写:
  1. 如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其(方法体)进行重新编写
  2. 子类重写后的方法中可以通过super().xxx()调用父类中被重写的方法
  • 多态的三个必要条件:继承、方法重写、父类引用指向子类对象
'''
封装:就是将属性和方法包装在类对象中     
作用:提高程序的安全性
    需求是:创建两个类,一个是士兵类,一个是枪类;
    枪类拥有名字,子弹数量,装弹方法,发射方法;
    士兵拥有名字,当有武器的时候可以开枪
'''
class Gun:
    def __init__(self, name):
        self.name = name # 枪的名字
        self.bullet = 0 # 子弹默认一开始是空的
    # 装弹的方法
    def add_bullet(self, bullet):
        self.bullet = bullet
    # 发射的方法
    def shoot(self):
        if self.bullet <= 0: # 判断有没有子弹
            print('没有子弹,请装弹!')
            return
        self.bullet -= 1
        print(f'发射成功!子弹还剩{self.bullet}')

class Soldier:
    def __init__(self, name):
        self.name = name
        self.gun = None # 如果遇到不知给属性添加什么属性值的时候就可以使用None
    # 开枪的方法
    def fire(self):
        # 这里self.gun是一个对象,可以通过实例化后再赋值
        if self.gun is None:
            print('士兵没有枪,没办法开枪')
            return
        self.gun.add_bullet(50)
        self.gun.shoot()

ak47 = Gun('ak47')  # 创建一把枪
Jack = Soldier('Jack') # 创建一个士兵
Jack.gun = ak47 # 给Jack一把枪
Jack.fire()  # Jack开枪

 

'''
继承:单继承、多继承
    如果一个类没有继承任何类,则默认继承object
    定义子类时,必须在其结构函数中调用父类的构造函数
'''
class Person(object): #Person继承object类
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def info(self):
        print(self.name,self.age)
#定义子类
class Student(Person):
    def __init__(self,name,age,stu_no):
        super().__init__(name, age) # 定义子类时,必须在其结构函数中调用父类的构造函数
        self.stu_no=stu_no

stu=Student('张三',20,'1001')
stu.info()

'''
# 多继承
class A(object):
    pass
class B(object):
    pass
class C(A,B):
    pass
#C有两个父类,分别是A和B

'''
'''
方法重写:
如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其(方法体)进行重新编写
子类重写后的方法中可以通过super().xxx()调用父类中被重写的方法
'''

class Person(object): #Person继承object类
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def info(self):
        print(self.name,"年龄:",self.age , end=' ')

#定义子类
class Student(Person):
    def __init__(self,name,age,stu_no):
        super().__init__(name, age)
        self.stu_no=stu_no
 
    def info(self):  # 方法重写
        super().info() # 重写方法时一定要在子类重写的方法中调用父类被重写的方法
        print("学号:",self.stu_no)
 
class Teacher(Person):
    def __init__(self,name,age,teachofvear):
        super().__init__(name,age) # 不继承父类的构造方法,相当于重新创建了构造函数
        self.teachofvear=teachofvear
 
    def info(self):
        # 如果不继承父类的构造方法,直接执行super().info()会报错  'Teacher' object has no attribute 'name'
        super().info() # 重写方法时一定要在子类重写的方法中调用父类被重写的方法        
        print('教龄:',self.teachofvear)
 
stu=Student('张三',20,'1001')
teacher=Teacher('李四',34,10)
 
stu.info()
teacher.info()
""" 
多态,可以理解为多种状态/多种形态,同一事物,由于条件不同,产生的结果不同。
简单来说(个人理解):不同的对象调用同一个接口(父类),表现出不同的状态,称为多态。

多态必须要满足两个条件:
    1.继承:多态必须发生在父类与子类之间
    2.重写:子类重写父类方法
"""
# 带参数的
class Food:
    def __init__(self, name):
        self.name = name

    def introduce(self):
        print('我是美味的食物')

class Rice(Food):
    def __init__(self, name, info):
        super().__init__(name)
        self.info = info

    def introduce(self):
        print(f'我是{self.name}{self.info}')

class Snacks(Food):
    def __init__(self, name, info):
        super().__init__(name)
        self.info = info

    def introduce(self):
        print(f'我是{self.name}{self.info}')

# 通过定义一个函数来实现多态,函数的传参是个对象
def fun(obj):
    obj.introduce() # 函数实现的功能是调用对象的introduce方法

fun(Rice('大米', '能喂饱大家的肚子')) # 传参时需传入对象的自己的参数
fun(Snacks('零食', '人们最爱我'))

# 不带参数的多态
class Animal(object):
    def eat(self):
        print('动物会吃')
class Dog(Animal):
    def eat(self):
        print('狗吃骨头...')
class Cat(Animal):
    def eat(self):
        print('猫吃鱼...')
 
class Person:
    def eat(self):
        print('人吃五谷杂粮')
 
#定义一个函数
def fun(obj):
    obj.eat()
 
#开始调用函数
fun(Cat())
fun(Dog())
fun(Animal())
 
fun(Person())

 

标签:__,info,name,python,子类,self,多态,重写,def
From: https://www.cnblogs.com/songshutai/p/16840287.html

相关文章

  • Python 多重继承时metaclass conflict问题解决与原理探究
    背景最近有一个需求需要自定义一个多继承abc.ABC与django.contrib.admin.ModelAdmin两个父类的抽象子类,方便不同模块复用大部分代码,同时强制必须实现所有抽象方法,没想按想......
  • Python 实现栈的几种方式及其优劣
    1栈的概念栈由一系列对象对象组织的一个集合,这些对象的增加和删除操作都遵循一个“后进先出”(LastInFirstOut,LIFO)的原则。在任何时刻只能向栈中插入一个对象,但只能取得......
  • 编译安装python解释器
    Step1官网下载对应版本的压缩包如下图是python3.9.14版本的解释器Step2进入终端找到该压缩包并解压tarxfPython-3.9.14.tgzcdPython-3.9.14.tgzStep3编译安......
  • python3使用libpcap库进行抓包及数据处理
    python版本:python3.9libpcap版本:1.11.0b7pythonlibpcap库是底层绑定c语言libpcap库的开发包,旨在提供python应用可访问的unixclibpcap库API(以及为win32系统提供的Npca......
  • python 与C++ 利用socket实现json数据传输
    单机python与C++程序利用socket实现json数据传输目录单机python与C++程序利用socket实现json数据传输需求实现方法的选择具体实现流程图示涉及到的技术1socket......
  • Python—Python语言的概述
    一、python简介     Python是一个高层次的结合解释性、编译性、互动性和面向对象的脚本语言,支持命令式编程、函数式编程和面向对象程序设计,具有广泛的应用领域。Pyt......
  • Python—程序的基本编写方法IPO方法
    每个程序都有统一的运算模式,即输入数据、处理数据和输出数据,这种朴素的运算模式形成了程序的基本编写方法,即IPO(Input,Process,Output)方法。输入(Input)是一个程序的开始......
  • Python—Python小程序运行实例
    实例一、根据圆的半径计算圆的面积radius=25#圆的半径是25area=3.1415*radius*radius#输入计算圆面积print(area)print("{:,2f}......
  • Python—运行Hello程序
          运行Python程序有两种方式:交互式和文件式。交互式是指Python解释器即时响应用户输入的每条代码,给出输入结果。文件式,也称为批量式,指用户将Python程序写入一个......
  • python中的if条件语句
    #如果。。。就。。。#1.print('1.')if1+1==2:print('1+1是等于2的')print('1+1还是等于2的')print('1+1就等于2的')#2.上网案例print('2.......