python类

        python是一种面向对象的变成语言。

        python几乎所有的东西都是对象,包括对象和属性。

一.类的定义

        python类的定义:

class ClassName:
    pass:

        实例:

注意:        

  •  类中的函数称为方法,有关于函数的一切适用于方法,唯一的区别在于函数的调用方式。
  • 方法__init__()是一个特殊的方法,每当你根据类进行实例化时(创建对象),Python都会自动调用,方法名是一种约定,旨在避免与普通方法发生冲突。相当于C++中的构造函数。
  • 当使用类实例化的对象,调用类中的方法时,Python会自动将实例化的对象传入,类中的方法必须用一个变量接收,如实例中的self变量(变量名可以随便取)。使用该变量调用实例中的方法和属性。

  • 类的组成包括:类的属性,实例方法,静态方法,类方法。类名在python中也是对象,是一个没有实例(实例属性和方法)的对象。

类的属性:分为实例属性和类属性。

        实例属性是指在实例化一个类时动态添加到实例对象中的变量,可以通过实例化对象访问。

        类属性是指被类的所有实例化对象,包括类名本身对象共享的变量,可以通过类名或类的实例化对象访问。类属性就是静态属性。

 实例方法,静态方法和类方法:python实例方法,类方法和静态方法区别_两片空白的博客-CSDN博客

二.类实例化对象

  • 对象创建和属性方法的使用

实例对象=类名()

使用通过'.'点操作符来访问属性和方法。

  • 实例方法的调用有两种方式:

实例对象.方法(...)

类名.方法(实例对象, ...)

my_dog=Dog("tager", 10)                                                         

Dog.sit(my_dog)
  • 对象的打印__str__()方法

        当我们实例化一个类对象,使用print打印类对象时,得到的时对象的地址。没有得到对象的属性。

         可以在类中定义__str__()方法,print时会调用__str__()方法,__str__()方法中需要返回字符串类型。

三.封装

        封装的作用:一是可将属性和行为包装到类对象中,需要通过实例化对象或类名来访问。二是在变量或者函数名前加两个"_",使属性和方法实现私有化。只能在类中访问,不能在类外访问。

        python中实现私有化的方法比较的方法比较简单,即在准备实现私有化的方法和属性名字前面加两个下划线即可。类中所有双下划线的名称都会自动变成:_类名__数据名的形式。比如:__x,python会自动将其变形成:_类名__x。

         由于python将__x转化成了_类名__x,于是会有下面的情况:

        以_类名__x的形式可以访问到python的私有变量,这种情况是需要程序员来避免的。

四.继承

        在python中,一个类可以继承另外一个类。原有的类称为父类,而新的类称为子类。子类继承父类的所有属性和方法,同时还可以定义自己的属性和方法。

        没有在括号中填父类,默认继承object类。

        继承的作用可以实现代码的复用。

语法:

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

        4.1 子类的__init()__方法

        创建子类实例时,python首先需要完成的任务是给父类的所有属性赋值。在子类__init()__中实现。

        在实例化子类对象时,需要将子类和父类的成员都传入。

        4.2 方法和属性重写

  • 属性重写

  • 方法重写

        子类继承父类方法,当父类方法不符合子类行为时,可以对父类的方法进行重写。重写的条件在于,需要子类的重写的方法和父类方法同名(只需要方法名相同即可,参数不需要相同)。

        4.3 继承原理(MRO——方法搜索顺序)

  • 主要用于继承中方法和属性的调用顺序,这个MRO列表就是一个简单的所有基类的线性顺序列表。
  • python中针对类提供了一个内置属性__mro__可以查看搜索顺序,搜索方法和属性时按照MRO列表顺序来进行搜索的。
  • 而这个MRO列表的构造是通过一个C3线性化算法来实现的。

搜索方法和属性规则: 

  • 如果在当前类中找到方法直接执行,不再搜索。
  • 如果当前类中没有找到方法,玩后面的顺序找,找到后执行,不在搜索。
  • 如果在整个搜索顺序中都没有找到,程序报错。 
  • 使用super来查找和直接查找属性和方法都是这个规则。

        python的继承不像C++中的继承,会在派生类中继承成员变量,实例化对象时,也会创建基类的成员变量。这样会导致在菱形继承时,会出现变量的冗余和二义性。

        而python中的继承通过MRO机制避免了这个问题,按照列表顺序在基类中查找方法或者属性,而不是在子类中创建父类变量。

重写原理:

        按照mro顺序列表查找方法和属性时,当子类重写了方法或者属性,调用方法或者属性时,在子类中找到方法(与参数无关)和属性,不会继续搜索。 基类的方法和属性等价于被隐藏了。

        4.3 super()用法

        4.2.1 定义

        super()是python中调用父类(超类)的一种方法。在子类中可以通过super()方法调用父类的方法和属性。超类是指具有两层以上继承关系的类。

        4.2.2 作用

  • 在继承中让代码维护更加简单。
  • 解决菱形继承带来重复调用,查找顺序(MRO)问题。

        4.2.3 使用——通过super()来调用子类和父类同名的方法

  • 单继承

        super().add(num)确实调用了父类的add()方法,并且父类中的实例和子类中的实例地址相同,说明是一个实例self。在父类中的self.n实际是子类的n,所以算出来n的结果是7。

  • 多继承

 五.多态

        多态是在继承体系中,调用相同的方法,通过传入不同的对象,有不同的动作。

        python中的多态没有C++中这么复杂,由于python中的变量无序声明数据类型就可以赋值,python对变量赋值就是创建一个新的变量,这个变量就是对应的类型。

        python中的多态是通过子类继承父类子类重写父类的方法。在当使用该方法时,会根据变量的不同来调用不同的方法。

  • 非继承和多态,不同类中有相同方法。

        由于没有继承关系,所以不属于多态。

  •  多态,重写父类方法

 六.特殊属性和方法

        6.1 特殊属性

  • __dict__

        放回类中方法或属性的字典

  • __class__

  • __bases和__base__:使用类调用

__base__:输出第一个父类类型。

__bases__:输出父类类型的元组。元组每一个位置都是一个类类型,都可以定义变量。

  • __mro__

        输出继承了那些父类类型的元组,查找属性和方法的顺序表。

        6.2 特殊方法 

  • __subclasses__()

        输出子类列表。

  •  __add__():重载+操作符

类不支持'+'操作,支持需要实现__add__()方法。

  •  __len__()内置方法计算长度

        len()函数中会调用类的__len__()方法

  •  __new__()在创建对象时调用,__init__()在初始化对象时调用

        想看下图发现:

        实例化对象时,先调用的__new__方法,再调用__init__方法。

        cls地址和A类对象地址相同。新创建的对象的obj和a和__init__方法中的self相同。

        即,

  1. 在调用A的__new__时A对象地址赋值给了cls
  2. cls传给super().__new__方法,新建完的对象传给obj
  3. 调用完A的__new__后调用__init__,obj对象传给了self
  4. self初始化后赋值给了a。

  • __repr__()

        在print()时会调用类的__repr__方法。我们可以重写__repr__方法,来实现需要的打印。

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

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

相关文章

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第一节、二节:图像描述概述和特征点

文章目录 一:图像描述概述(1)图像描述(2)描述子 二:特征点(1)Moravec角点检测A:原理B:程序 (2)Harris角点检测A:原理B&…

Flutter小功能实现-咖啡店

1 导航栏实现 效果图: 1.Package google_nav_bar: ^5.0.6 使用文档: google_nav_bar | Flutter Package 2.Code //MyBottomNavBar class MyBottomNavBar extends StatelessWidget {void Function(int)? onTabChange;MyBottomNavBar({super.key, …

uniapp 支持图片放大

<view class"list" v-for"(item, index) in urls" :key"index"><image :src"item" click"viewImg(item, index)" disabled></image></view> js // 预览大图 viewImg(data, index) {uni.previewImag…

04. 函数和函数调用机制

1. 先学习/复习C语言的入门知识 1.1 C语言简介 C语言是一种通用的编程语言&#xff0c;于1972年由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;创建。C语言最初目的是为了开发UNIX操作系统&#xff0c;但由于其简洁的语法、快速的执行速度和可移植性&#xff0c;自此成…

3D 碰撞检测

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 轴对齐边界框 与 2D 碰撞检测一样&#xff0c;轴对齐边界框 &#xff08;AABB&#xff09; 是确定两个游戏实体是否重叠的最快算法。这包括将游戏实体包装在一个非旋转&#xff08;因此轴对齐&#xff09;的框中&#…

计算机毕业设计 校园二手交易平台 Vue+SpringBoot+MySQL

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师&#xff0c;全栈领域优质创作者。 项目内容…

【C++入门】命名空间、缺省参数、函数重载、引用、内联函数

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C入门学习必备语法 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.9.3 前言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加…

Android JNI系列详解之ndk-build工具的使用

一、Android项目中使用ndk-build工具编译库文件 之前介绍过CMake编译工具的使用&#xff0c;今天介绍一种ndk自带的编译工具ndk-build的使用。 ndk-build目前主要有两种配置使用方式&#xff1a; 如上图所示&#xff0c;第一种方式是Android.mkApplication.mkgradle的方式生成…

plumelog介绍与应用-一个简单易用的java分布式日志系统

官方文档&#xff1a;http://www.plumelog.com/zh-cn/docs/FASTSTART.html 简介 无代码入侵的分布式日志系统&#xff0c;基于log4j、log4j2、logback搜集日志&#xff0c;设置链路ID&#xff0c;方便查询关联日志基于elasticsearch作为查询引擎高吞吐&#xff0c;查询效率高全…

UE4/5在蓝图细节面板中添加函数按钮(蓝图与c++的方法)

目录 在细节面板中添加按钮使用函数 蓝图的方法 事件 函数 效果 uec的方法 效果 在细节面板中添加按钮使用函数 很多时候&#xff0c;我们可以看到一些插件的actor类中&#xff0c;点击一下之后就可以实现如矩阵一样的效果。 实际上是因为其使用了函数来修改了蓝图中的数…

给oracle逻辑导出clob大字段、大数据量表提提速

文章目录 前言一、大表数据附&#xff1a;查询大表 二、解题思路1.导出排除大表的数据2.rowid切片导出大表数据Linux代码如下&#xff08;示例&#xff09;&#xff1a;Windows代码如下&#xff08;示例&#xff09;&#xff1a;手工执行代码如下&#xff08;示例&#xff09;&…

VR司法法治教育平台,沉浸式课堂教学培养刑侦思维和能力

VR司法法治教育平台提供了多种沉浸式体验&#xff0c;通过虚拟现实(Virtual Reality&#xff0c;简称VR)技术让用户深度参与和体验法治知识。以下是一些常见的沉浸式体验&#xff1a; 1.罪案重现 VR司法法治教育平台可以通过重现真实案例的方式&#xff0c;让用户亲眼目睹罪案发…

2023年“羊城杯”网络安全大赛 Web方向题解wp 全

团队名称&#xff1a;ZhangSan 序号&#xff1a;11 不得不说今年本科组打的是真激烈&#xff0c;初出茅庐的小后生没见过这场面QAQ~ D0n’t pl4y g4m3!!! 简单记录一下&#xff0c;实际做题踩坑很多&#xff0c;尝试很多。 先扫了个目录&#xff0c;扫出start.sh 内容如下…

P1886 滑动窗口 /【模板】(双端队列)+双端队列用法

例题 有一个长为 n 的序列 a&#xff0c;以及一个大小为 k 的窗口。现在这个从左边开始向右滑动&#xff0c;每次滑动一个单位&#xff0c;求出每次滑动后窗口中的最大值和最小值。 例如&#xff1a; The array is [1,3,−1,−3,5,3,6,7],and k3。 输入格式 输入一共有两行…

SpringBoot Mybatis 多数据源 MySQL+Oracle+Redis

一、背景 在SpringBoot Mybatis 项目中&#xff0c;需要连接 多个数据源&#xff0c;连接多个数据库&#xff0c;需要连接一个MySQL数据库和一个Oracle数据库和一个Redis 二、依赖 pom.xml <dependencies><dependency><groupId>org.springframework.boot&l…

python 深度学习 解决遇到的报错问题4

目录 一、DLL load failed while importing _imaging: 找不到指定的模块 二、Cartopy安装失败 三、simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 四、raise IndexError("single positional indexer is out-of-bounds") 五、T…

LLMs:OpenAI官方重磅更新——新增GPT-3.5Turbo调和API更新功能

LLMs&#xff1a;OpenAI官方重磅更新——新增GPT-3.5Turbo调和API更新功能 导读&#xff1a;2023年8月22日&#xff0c;OpenAI官方发布&#xff0c;开发者现在可以使用自己的数据来定制适用于其用例的GPT-3.5 Turbo模型。GPT-3.5 Turbo的微调现在已经可用&#xff0c;GPT-4的微…

redis 应用 4: HyperLogLog

我们先思考一个常见的业务问题&#xff1a;如果你负责开发维护一个大型的网站&#xff0c;有一天老板找产品经理要网站每个网页每天的 UV 数据&#xff0c;然后让你来开发这个统计模块&#xff0c;你会如何实现&#xff1f; img 如果统计 PV 那非常好办&#xff0c;给每个网页一…

Axure RP仿QQ音乐app高保真原型图交互模板源文件

Axure RP仿QQ音乐app高保真原型图交互模板源文件。本套素材模板的机型选择华为的mate30&#xff0c;在尺寸和风格方面&#xff0c;采用标准化制作方案&#xff0c;这样做出来的原型图模板显示效果非常优秀。 原型中使用大量的动态面板、中继器、母版&#xff0c;涵盖Axure中技…

【笔记】PyCharm快捷键大全

PyCharm是一种Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。它被认为是Python开发中最强大、最流行的IDE之一。PyCharm具有完整的Python开发工具链&#xff0c;包括先进的代码编辑器、代码分析工具、集成的调试器、版本控制系统集成、自动化…