首页 > 编程语言 >Python进阶(1)--面向对象

Python进阶(1)--面向对象

时间:2024-07-16 22:27:04浏览次数:14  
标签:__ run 进阶 Python 子类 self 多态 -- 父类

文章目录

面向对象

Python 是一种广泛使用的解释型、高级编程、通用型编程语言,它以其简洁、易读以及面向对象的特性而闻名。面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它使用“对象”来设计应用程序和计算机程序。在面向对象的程序设计中,我们定义了一组类(class),这些类描述了具有属性和方法(也称为成员函数)的对象。

接下来让我们了解了解类的概念:

类的定义

在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

类的构造

比如一只小猫,是不是有四条腿、两个眼睛,这是小猫的属性。那一只小猫它的叫声是不是”喵喵“呐,这是小猫的一直特征行为。那么我们在构造一个类时,也可以将其分成两个部分构造:属性和方法。在 Python 中,使用class 关键字来定义类,类中的函数称为方法。

类的定义格式如下图所示:

在这里插入图片描述

我们来尝试构造一个类:

定义一个Student类用于打印学生的成绩

先定义一个class:
class Student:	#定义类的时候首字母大写
    eye = 2		#学生有两只眼睛,这是他的属性

接下来,我们来初始化一个方法,打印学生成绩要有学生名和成绩,那我们来定义它的参数:

class Student:
    # 构造方法  在类被定义的使用就会使用
    def __init__(self, n, s):	#初始化方法
        # self 类中的变量 全类可用
        # 类中的属性
        self.name = n		#初始化变量
        self.score = s
     #方法   
    def print_sco(self):	
        print(f"{self.name}的成绩是{self.score}")

实例化一个类

对于上面构造的Student类,我们来实例化看看:

定义好了Student类,就通过类名+()创建出Student的实例

if __name__ == '__main__':

    # 实例化一个类
    ls = Student("ls",89)
    ls.print_sco()
--------------------------
输出结果:
ls的成绩是89

三大特点

面向对象主要有三大特点:封装、继承和多态。

封装

面向对象编程的一个重要特点就是数据封装。在之前的Student类中,每个实例就拥有各自的name和score这些数据,在类中可以通过函数来访问这些数据,比如打印一个学生的成绩:

既然Student实例本身就拥有这些数据,要访问这些数据,就不需要通过外部函数访问,可直接在Student类的内部定义访问数据的函数,这样就把“数据”给封装起来了。这些封装数据的函数是和Student类本身是关联起来的,称之为类的方法。

所以,当我们将完整的类创建完成之后,即完成了分装。

私有属性

我们发现在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性,比如:

#通过类的变量直接去修改变量值
ls.__score = 99
print(ls.__score)
----------------------
输出结果:
99

这样就会让代码变得不安全。

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,只有内部可以访问,外部不能访问,比如:

class Student:
    def __init__(self, n, s):
        self.name = n
        # 私有变量  可以在类的内部去处理  安全一点 不能在外部直接去修改这个值
        self.__score = s

继承和多态

继承

在OOP程序设计中,当定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。

如,先定义一个名为Animal的class,有一个run()方法可以直接打印:

class Animal(object):

    def __init__(self, leg, height):
        self.leg = leg
        self.height = height

    def run(self):
        print("Animal is run")

当需要编写Dog和Cat类时,就可以直接从Animal类继承:

# 在括号里面写入父类的名称
class Dog(Animal):
    def __init__(self, leg, height, bark):
        # self.leg = leg	可以不这样重复编写
        # self.height = height
        
        # 使用父类的初始化方法
        super().__init__(leg, height)	#继承父类的属性
        self.bark = bark

    def eat_shit(self):		#子类独有的方法
        print("dog can eat shit")
    pass

对于Dog来说,Animal就是它的父类,对于Animal来说,Dog就是它的子类。Cat和Dog类似。

继承的作用

继承有什么好处?最大的好处是子类获得了父类的全部功能。由于Animial实现了run()方法,因此,Dog和Cat作为它的子类,什么事也没干,就自动拥有了run()方法:

if __name__ == '__main__':
	snoopy = Dog(3, 1.2, "wangwang")
	snoopy.run()
-----------------------
输出结果:
Animal is run

当然,也可以对子类增加一些方法,比如Dog类:

    # 父类存在  子类有不同的方式方法   方法的重写
    def run(self):
        print("dog is running")

当子类和父类都存run()方法时,可以看做子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run()。输出的就是子类的结果:

snoopy.run()
---------------------
dog is running

这样就获得了继承的另一个好处:多态

多态

多态:父类的引用指向子类的对象

多态的基础条件是继承

接着上面继续定义一个函数:

def run_twice(animal:Animal):
    animal.run()
    animal.run()

我们可不可以这样调用函数?:

animal = Animal(4,1)
spike = Dog(3,1.2,"wangwang")

run_twice(animal)
run_twice(spike)

在run_twice(animal:Animal)中,animal只是一个变量,只要我们类里面有run的方法就可以传进去
不是只能传animal

可以,这样就体现了我们的多态:多种形态。

总结

本篇介绍了:

  1. 什么是面向对象
  2. 类:
    1. 定义类的时候首字母大写
    2. 分成两个部分构造:属性和方法。
  3. 三大特点:封装、继承和多态
    1. 封装:将完整的类创建完成,包装好
    2. 继承:
      1. 子类获得了父类的全部功能
      2. 当子类和父类具有相同的功能时,父类方法被覆盖
    3. 多态:父类的引用指向子类的对象,多态的基础条件是继承

们的多态:多种形态。

总结

本篇介绍了:

  1. 什么是面向对象
  2. 类:
    1. 定义类的时候首字母大写
    2. 分成两个部分构造:属性和方法。
  3. 三大特点:封装、继承和多态
    1. 封装:将完整的类创建完成,包装好
    2. 继承:
      1. 子类获得了父类的全部功能
      2. 当子类和父类具有相同的功能时,父类方法被覆盖
    3. 多态:父类的引用指向子类的对象,多态的基础条件是继承

标签:__,run,进阶,Python,子类,self,多态,--,父类
From: https://blog.csdn.net/m0_74896766/article/details/140478611

相关文章

  • 【嵌入式】面试笔试问题整理 (持续更新)
    题目答案分离,方便自查自测快速跳转:面试笔试问题==1.关键字static有什么用途?(请至少说明两种)====2.嵌入式系统中经常要用到无限循环,如何用C编写死循环?====3.程序的局部变量存在于哪里,全局变量存在于哪里,动态申请数据存在于哪里?====4.什么是平衡二叉树?====5.解释一下......
  • CSS文字控制属性
    CSS文字控制属性一、字体大小二、字体粗细三、字体倾斜四、行高五、字体族六、font复合属性七、文本缩进八、文本对齐方式九、文字修饰线十、文字颜色一、字体大小属性名:font-size属性值:文字尺寸,常用单位像素(px)、百分比(%)例:p{ font-size:50px;}二、字体粗......
  • Spring框架(IOC和AOP详解)
    重生之我在CSDN学java第七天(IOC和AOP)文章目录重生之我在CSDN学java第七天(IOC和AOP)一、IOC(InversionofControl)1.核心概念2.入门案例创建一个spring的maven项目导spring上下文包业务层实现(依赖dao对象运行)数据层实现创建spring的配置文件BeanBean配置文件创建......
  • 【Java--数据结构】二叉树
    欢迎关注个人主页:逸狼创造不易,可以点点赞吗~如有错误,欢迎指出~树结构树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合注意:树形结构中,子树之间不能有交集,否则就不是树形结构常见概念  节点的度:一个节点含有子树的个数,如A的度为6......
  • 动态规划+0-1背包问题
    一、问题描述小明周末要参加学校组织的跳蚤市场活动,他准备了足球、旱冰鞋、随身听和单词书四件物品进行交易,要用他的书包把这些物品带到学校。各物品的重量w和价值v如下图所示,小明书包的最大承重量为9(忽略单位),请你帮助他找到最合理的搭配方案,使他能用书包带到学校的物品价值最......
  • 用结构体实现一个简单的学生管理系统
    使用结构体完成学生(学号、姓名、性别、成绩)管理系统1.使用菜单实现2.功能1:完成对学生信息的录入,确定人数,完成输入3.功能2:完成对学生信息的输出4.功能3:输出成绩最高和最低学生的信息5.功能4:输出学生的总成绩和平均成绩6.功能5:对学生信息按成绩进行排序,根据传......
  • 排球比赛计分程序用户画像和用户愿景
    用户画像:用户画像一:专业排球裁判•年龄:25-55岁•性别:不限•职业:专业排球裁判•技术背景:熟悉各类体育赛事的裁判规则和流程,熟练操作电子设备。•期望:•计分功能精准无误,实时反映比赛状况。•操作界面简洁明了,不分散裁判注意力。•统计功能全面,涵盖球员表现和犯......
  • test
      ▶️   ⚣  ✚ |<< ⇦ ⟳1/   ⇨  >>|  ⇩svg  ⇩ᯤX ⇩ᯤggbppt ⇩ 四   田  ⇈  ⇊  ↶ ✕  Help  notes......
  • Stream流求和
    Stream流对List<Object>和Set<Object>求和泛型为Integer、Long、Double、BigDecimal的求和使用reduce+orElseIntegersum=scores.stream().reduce(Integer::sum).orElse(0);Longsum=scores.stream().reduce(Long::sum).orElse(0L);Doublesum=scores.stream().r......
  • vue 使用svg文件图片或者组件方式
    代码<template><!--svg使用--><divclass="box"><div><!--设置stylefill:ref方式可以直接修改svg颜色样式--><svgstyle="fill:red"xmlns="http://www.w3.org/2000/svg"......