python——类

问:小编为什么突然开始发python?难道C语言你不行了?

废话少说,让我们进入python中的类的学习!!

(一)基本知识

(1)掌握类的概念

1、类的定义:

即用来描述具有 相同属性和方法 的对象的集合

2、示例:

就像int类,其中有100,20等不同的对象。(和C语言中的结构体类似)

(2)定义一个类

1、语法:

class Student:

        pass         #pass语句的作用就是占位,在还未确定好具体的内容的时候使用

2、 类 Student是对象吗?

在python中,只要是对象,那么就有地址,类型和值三个,

所以我们可以验证!!

代码如下:

class Student:
    pass
print(id(Student))
print(type(Student))
print(Student)

由代码的结果我们可以知道,类也是对象!

(3)类的组成

1、示例
class Student:
    my_home='甘肃'   #类属性
    def __init__(self,name,age):# __init__ 实例方法
        self.name=name
        self.age=age

    def meat(self): #方法
        print("喜欢吃肉")

    @classmethod
    def cm(cls):#类方法
        print("类方法")

    @staticmethod
    def sm():#静态方法
        print("静态方法")

由代码所示,类的组成一般就是这四个,不需要全部都存在(看具体情况,自行添加)

2、组成各部分的具体解释
(1)def __init__ (self,name,age):

                 self.name = name

                 self.age = age

在Python中,def __init__(self): 是一个特殊的方法,被称为构造函数或初始化方法。它是在创建一个类的实例时自动调用的,用于初始化该实例的属性。

  •  __init__(self) 方法的定义中,形参self 必不可少,而且必须位于其他形参的前面。Python调用这个方法来创建 Student 实例时,将自动传入实参self
  • self参数代表当前实例对象。通过self可以访问实例的属性和方法。
  • __init__(self)方法中,我们可以给实例对象设置初始值。可以通过self.属性名(注意,这个属性名可以是任何名称,并且与之后的调用是相对应的,但是(self,name,age)中的name和age尽量见名知意来指定实例对象的属性,并为其赋予初始值。
  • 如何使用呢? 即在类之外使用  具体如下                                                                         
     person=Student('张三',20)#创建一个实例对象
    即就是给 name初始化为 ’张三‘ age初始化为20 。调用时,如果想打印 person中的值,可以写为如下代码 
     print(person.name,person.name)
(2)def meat ( self ) :

                 print("喜欢吃肉")

在python中,def meat(self): 是 自定义的方法,参数为 self  。

在这个方法中,可以调用实例方法中的实例!!

  • 在自定义方法中调用实例方法中的属性                                                                                   如:person.meat() #注意这里一定是已经创建了一个person的实例对象,代码请看之前
(3)  @classmethod
           def cm(cls):#类方法
                   print("类方法")

          @staticmethod
          def sm():#静态方法
                  print("静态方法")

  • 这两种方法的调用类似,都是直接使用 类名.方法名 来调用,如下:
    Student.cm()
    Student.sm()
(4)类属性
  • 类中的方法外的变量,被所有的对象共享!
    • 类属性的调用                                                                                                                  上述的代码,即可调用写为 print (Student.my_home )

(二)动态绑定属性和方法

(1)动态绑定属性

在python中,类在定义好之后,可能有时候会涉及到某一个实例对象的属性不想再另外一个实例对象中使用,那么这个时候就需要动态绑定来解决

具体如下:还是上述建立的 Student类 首先创建两个实例对象 然后存储在 stu1 和stu2 中

代码如下

stu1 = Student('李四',20)
stu2 = Student('王麻子',30)

现在代码中是两个人的信息,现在已知的是 李四是个男的,需要打印出来,但是王麻子性别不知道,所以不打印,那么应该怎么做? 

          直接在 __init__(self) 方法中再加一个 性别属性?但是仔细想想,那样定义的属性是所有的实例对象共有的,所以是不行的,那就让我们使用动态绑定的方法来解决!

如下:

我们发现,第三行代码就是给stu1动态绑定一个属性,此时当stu2也试图使用的时候就会发生错误

(2)动态绑定方法

基本原理同上述动态绑定属性

(1)和绑定属性一样,单独绑定一个方法需要在类之外

如下:

如图片所示,相当于定义了一个函数,然后单独绑定给了stu1,最后一行代码是调用。

(三)面向对象的三大特征

(1)封装

1、作用:提高程序的安全性

2、具体:就是将数据(类型)和行为(方法)包装到类对象中,并且隐藏对象的属性和实现的细节,只暴露调用方法

小技巧:可以在类中某个属性名称前面加上__(两个下划线),从而不希望在外部被访问;

我们发现这样对实例属性进行操作之后,就无法以正常的方式在类外调用

但是任然可以通过 dir()查出类中的所有属性,然后看具体应该如何使用,如下:

我们发现,stu1 所对应的 实例属性'_Student__brand' ,和其他如:name 不太相同,这说明是有着特定的语法能够调用的!

具体语法格式为  :stu1._Student__brand

(2)继承

1、语法格式:

class 子类名(父类1,父类2,...)

  • 在python中,支持多继承
  • 若没有填写父类,则默认继承 object类
  • 定义子类的时候,必须在其构造函数中调用父类的构造函数                                        
2、示例:

代码如下

class Person(object):#此处的子类为Person,父类为 object
    def __init__(self,name,age):#在Person类中有实例方法
        self.name = name
        self.age = age
    def info(self): #在Person中定义一个方法 info,作用是打印实例属性 name和age
        print(self.name,self.age)
class Student(Person):#此处的子类为Student ,父类为 Person
    def __init__(self,name,age,student_year):#此处为定义自己的实例方法,多了一个实例属性为
                                             #student_year
        super().__init__(name,age)#继承其父类的实例方法,必须为super().父类方法名()
        self.student_year = student_year#属性重写
    def info(self):#定义自己的方法
        super().info()#继承父类的方法,必须为super().父类方法名()
        print(self.salary)#方法重写
class Teacher(Person):#原理同上
    def __init__(self,name,age,teacher_year):
        super().__init__(name,age)
        self.teacher_year=teacher_year
    def info(self):
        super().info()
        print(self.teacher_year)
stu=Student('zhangsan',20,5)#创建Student的类的实例对象,存放在stu中,其中包含在父类中继承的两个属性和自定义的一个属性
tea=Teacher('lisi',35,10)#同上
stu.info()#调用方法
tea.info()

在本代码中,有小编写的详细的注解,接下来图解上述代码,大家可以通过图片来理解!

(3)方法重写

1、即子类继承的父类中的属性和方法,对于子类来说是不足以支持子类的需求的,此时就需要对其进行重写

2、示例:

(1)属性重写;上述 继承 中的代码片段,有

对于这个父类,只有两个实例属性,最后创建好调用,可以打印姓名和年龄,但是很明显对于 Student 和Teacher两个子类是不足够的,那么就可以写为如下

我们不难发现,在两个子类中又加了属性分别为 student_year , teacher_year


方法重写:也在上述代码中有体现,你发现了吗?

(四)object类/多态

(1)object 类

1、定义

所有类的父类,所有类都有object类中的属性和方法

2、内置函数 dir

(1)作用,在之前我们已经提及,其作用就是可以查看所指定对象中的方法和属性

(2)用法:print(dir(某个对象名称))

(3)示例:查看object类

(4)重写 __str__ 方法

在python中,object类中的所有方法都是可以进行重写的,从而改变其原来的作用原理,来达到自己所需要的目的!

对于 str 方法,其默认是在使用print函数来打印类的对象的时候实现的,其作用是返回地址

1、未改写之前(代码还是上述 ‘继承’ 中的代码)

2、改写

def __str__(self):
    return '名字{0},今年{1}岁,当学生{2}年'.format(self.name,self.age,self.student_year)

代码写在Student类中,

改写之后再次打印

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/896432.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python安装transformer教程

本章教程,记录在Windows中如何使用python安装transformer。 一、安装依赖 pip install transformers推荐使用国内镜像源,速度会快很多。 二、测试代码 from transformers import pipeline# 加载一个文本生成模型 text_generator = pipe

LCWLAN设备的实际使用案例

我们的LCWLAN设备在实际使用中以裸板的形式放在客户的智能总线控制器中,客户的 智能总线刀片灯,柔性灯货架,柔性感应钢网柜以及智能电子料架等设备都是接到总线控制 器中,然后总控制器通过CAN总线和我们的LCWLAN设备连接&#xff…

Linux DEADLINE调度算法详解

介绍 在实时系统中,调度算法的选择对于任务的及时执行至关重要。为了满足实时性需求,Linux内核引入了不同的调度算法,其中 DEADLINE 调度算法是为硬实时任务而设计的。DEADLINE 调度算法的目标是在多任务的情况下确保任务在其指定的最后期限…

Cpp::STL—容器适配器Stack和Queue的讲解和模拟实现(15)

文章目录 前言一、适配器模式概念分类 二、Stack核心作用代码实现 三、Queue核心作用代码实现 四、deque双端队列貌似兼收并蓄?实则也难以兼得~ 总结 前言 适配器也是STL六大组件之一,请跟我一起领悟它的智慧!   正文开始! 一、…

如何实现简单的 WinCC 项目分屏?

说明: 本文主要介绍了在不使用分屏器的情况下,通过 WinCC 项目中的设置,实现简单的分屏操作。两台显示器分别显示不同的 WinCC 画面,独自操作,互不影响。 试验环境 : 本文试验时所用硬件及软件环境…

案例分享—国外优秀UI设计作品赏析

国外UI界面设计之所以出色,首要原因在于其注重用户体验。设计师们深入洞察用户需求,通过细致的用户调研和数据分析,确保界面布局、色彩搭配及交互方式都能贴合用户习惯,从而提供流畅、直观的操作体验,增强用户满意度和…

【MySQL】数据库基础、库的操作、表的操作、数据类型

目录 1. 数据库基础1.1 MySQL是什么1.2 使用案例1.3 服务器,数据库,表关系 2. 库的操作2.1 字符集和校验规则2.1.1 查看系统默认字符集以及校验规则2.1.2 查看数据库的字符集和校验规则2.1.3 修改数据库的字符集和校验规则 2.2 库的操作2.2.1 创建数据库…

c++算法第4天

本篇文章包含三道算法题&#xff0c;难度由浅入深&#xff0c;适合新手练习哟 第一题 题目链接 牛牛的快递_牛客题霸_牛客网 题目解析 <1kg -------> 20元 大于1kg&#xff1a;超出部分每千克1元 加急 5元 代码原理 代码编写 #include …

QT 实现自定义水波进度条

1.界面实现效果 以下是具体的项目需要用到的效果展示。 2.简介 原理:随着进度的改变,在我们的绘制图像void paintEvent(QPaintEvent *) override;事件中绘制图形。 使用QPainter来绘制正弦波,通过定时器,不断的更新我们绘制的图形,动态改变正弦波的参数来创建动画效果…

【从零开始的LeetCode-算法】3099. 哈沙德数

如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&#xff09;。给你一个整数 x 。如果 x 是 哈沙德数 &#xff0c;则返回 x 各个数位上的数字之和&#xff0c;否则&#xff0c;返回 -1 。 示例 1&#xff1a; 输入&am…

提高阅读效率:三种读书笔记方法的实践

你是否曾经感到&#xff0c;尽管阅读了大量书籍&#xff0c;却很少有几本能够留下持久的印象&#xff0c;甚至书中的人物也逐渐从记忆中消失。实际上&#xff0c;这种阅读方式可能并没有太大的价值。要想真正从阅读中获益&#xff0c;培养良好的阅读习惯至关重要&#xff0c;而…

IDEA下lombok安装及找不到get,set的问题的解决方法

在IDEA中使用Lombok,但是在编译时&#xff0c;提示找不到set()和get()方法&#xff0c;明明在javabean中使用了Data注解&#xff0c;但是编译器就是找不到。 Idea下安装Lombok(需要二步) 第一步&#xff1a; pom.xml中加入lombok依赖包 1 2 3 4 5 6 7 <!-- https://mvnre…

Linux的开发工具gcc Makefile gdb的学习

一&#xff1a;gcc/g 1. 1 背景知识 1. 预处理&#xff08;进行宏替换) 预处理 ( 进行宏替换 ) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结…

如何在算家云搭建PhotoMaker(图像生成)

一、PhotoMaker简介 PhotoMaker是一种高效、个性化的文本转图像生成方法&#xff0c;能通过堆叠 ID 嵌入自定义的逼真人类照片。相当于把一张人类照片的特征提取出来&#xff0c;然后生成你想要的不同风格照片&#xff0c;如写真等等。 主要特点&#xff1a; 在几秒钟内快速…

远控代码的重构-远控网络编程的设计上

套路化代码 但是我们这是一个MFC工程,我们需要考虑不是所有操作都需要到main函数里面实现,有些操作可以在main函数之前完成,有些可以在main函数返回以后完成,静态全局变量满足这个需求,我们需要添加一个自己的类 编辑器细节1 添加类和添加类向导的区别,一个是添加自己的类,一…

ESP8266 模块介绍—AT指令学习 笔记

零、简介 感谢百文网韦东山 老师对ESP8266模块的讲解 笔记在CSDN也有文章备份 大家可以在我的gitee仓库 中下载笔记源文件、ESP8266资料等 笔记源文件可以在Notion中导入 一、ESP8266-01S模块详细介绍 1. 名字的由来 ESP8266 是方形的主控芯片旁边的长方形是一个Flash-0…

000010 - Mapreduce框架原理

Mapreduce框架原理 1. InputFormat 数据输入1.1 切片与 MapTask 并行度决定机制1.2 Job 提交流程源码和切片源码详解1.2.1 Job 提交流程源码详解1.2.2 FileInputFormat 切片源码解析&#xff08;input.getSplits(job)&#xff09; 1.3 FileInputFormat 切片机制1.3.1 切片机制1…

基于Springboot个性化图书推荐系统的设计与实现

基于Springboot个性化图书推荐系统的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;…

整理—计算机网络

目录 网络OSI模型和TCP/IP模型 应用层有哪些协议 HTTP报文有哪些部分 HTTP常用的状态码 Http 502和 504 的区别 HTTP层请求的类型有哪些&#xff1f; GET和POST的使用场景&#xff0c;有哪些区别&#xff1f; HTTP的长连接 HTTP默认的端口是什么&#xff1f; HTTP1.1怎…

兴业周报|央行宣布“有力度的降息”他来了

耕天下4号楼1单元5-103室&#xff08;复式&#xff09; 稀有户型&#xff1a;标的物为二环内南北通透4居室复式&#xff0c;低密度花园洋房&#xff0c;小区中心位置&#xff0c;前后不临街。 黄金地段&#xff1a;耕天下东接天坛公园、西靠陶然亭公园、南临南护城河、北抵先…