python - 类和对象

一.类

类名用大写字母开头

属性是类中的变量,方法是类中的函数

类、class关键字:

>>> class Turtle:
...     color = 'green'
...     weight = 10
...     legs = 4
...     shell = True
...     mount = '大嘴'
...     def climb(self):
...             print("我正在努力的向前爬")
...     def run(self):
...             print("我正在飞快的向前怕")
...     def bite(self):
...             print("咬死你咬死你")
...     def eat(self):
...             print("有的吃真满足")
...     def sleep(self):
...             print("困了困了")
...
>>> t1 = Turtle()
>>> t1.color
'green'
>>> t1.weight
10
>>> t1.legs
4
>>> t1.shell
True
>>> t1.mount
'大嘴'
>>> t1.climb()
我正在努力的向前爬
>>> t1.run()
我正在飞快的向前怕
>>> t1.bite()
咬死你咬死你
>>> t1.eat()
有的吃真满足
>>> t1.sleep()
困了困了

二.封装

在创建对象之前,通过类将相关的属性和方法给打包到一起。然后再通过类来生成相应的对象

>>> class C:
...     def hello():
...             print('hello')
...
>>> c = C()
>>> c.hello()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: C.hello() takes 0 positional arguments but 1 was given
>>> class C:
...     def getSelf(self):
...             print(self)
...
>>> c = C()
>>> c.getSelf()
<__main__.C object at 0x000001536290D2E0>
>>> c
<__main__.C object at 0x000001536290D2E0>

传递到方法中self参数的实参就是实例对象本身

一个类可以生成无数个对象,当调用类中的方法时,python为了明确是哪一个实例对象在调用该方法,于是使用self参数将调用该方法的实例对象的信息进行了传递。

三.继承

当子类继承父类时,子类拥有和父类相同的方法和相同的属性

>>> class A:
...     x = 1
...     def hell(self):
...             print('你好')
...
>>> class B(A):
...     def bb(self):
...             print('我是B的对像')
...
>>> b = B()
>>> b.x
1
>>> b.bb()
我是B的对像
>>> b.hell()
你好
>>> class B(A):
...     x = 123
...     def hello(self):
...             print('我是B的对象')
...
>>> b = B()
>>> b.x
123
>>> b.hello()
我是B的对象

isinstance():判断某个对象是否属于某个方法

>>> isinstance(b,B)
True
>>> isinstance(b,A)
True

issubclass():检测一个类是否为某个类的子类

>>> issubclass(B,A)
True

多重继承

>>> class A:
...     x = 1
...     def hello(self):
...             print('你好')
...
>>>
>>> class B():
...     x = 123
...     def hello(self):
...             print('这里是B')
...
>>> class C(A,B):
...     pass
...
>>> c = C()
>>> c.x
1
>>> c.hello()
你好

多重继承时,多个父类拥有同样的属性和方法,子类对象调用时优先级从左至右。

组合:

组合(将需要的类一起进行实例化并放入新的类中),非继承关系的几个类放到一起

>>> class A:
...     def hello(self):
...             print('这里是A')
...
>>> class B:
...     def hello(self):
...             print('这里是B')
...
>>> class C:
...     def hello(self):
...             print('这里是C')
...
>>> class ABC:
...     a = A()
...     b = B()
...     c = C()
...     def hello(self):
...             self.a.hello()
...             self.b.hello()
...             self.c.hello()
...
>>> abc = ABC()
>>> abc.hello()
这里是A
这里是B
这里是C

绑定

实例对象跟类的方法进行绑定

实例能拥有自己的属性,如果要通过类的方法对属性进行操作,则需要使用self进行绑定

>>> class A:
...     x = 120
...     def set_x(self,i):
...             self.x = i
...
>>> a = A()
>>> a.set_x(520)
>>> a.x
520

若没有这个self,那么直接对x进行操作,只是在set_x()函数内部创建了一个局部变量x

四.构造函数

构造函数__init__()

在类中定义__intit__()方法,就可以在实例化对象的时候实现一些变量的初始化

如果创建类的时候,没有添加构造函数,python解释器会自动创建一个不执行任何操作的默认构造函数;也就是说,只要创建类,一定会伴随着一个构造函数诞生。只不过可以自定义一个构造函数,也可以由python解释器自动创建一个默认的构造函数。

>>> class go:
...     def __init__(self, x, y):
...             self.x = x
...             self.y = y
...     def add(self):
...             return self.x + self.y
...     def mul(self):
...             return self.x * self.y
...
>>> a = go(3,4)
>>> a.__dict__
{'x': 3, 'y': 4}
>>> a.add()
7
>>> a.mul()
12

五.重写

子类可以重新定义父类已有的属性和方法来对父类中同名的属性和方法进行覆盖。

可以在子类中直接调用父类的方法,即调用未绑定的父类方法。但会造成钻石继承的问题。

>>> class gozi(go):
...     def __init__(self, x, y, z):
...             go.__init__(self, x, y)
...             self.z = z
...     def add(self):
...             return go.add(self) + self.z
...     def mul(self):
...             return self.x * self.y * self.z
...
>>> b = gozi(2, 3, 4)
>>> b.__dict__
{'x': 2, 'y': 3, 'z': 4}
>>> b.add()
9
>>> b.mul()
24

钻石继承问题:

>>> class A:
...     def __init__(self):
...             print('这里是A')
...
>>> class B1(A):
...     def __init__(self):
...             A.__init__(self)
...             print('这里是B1')
...
>>> class B2(A):
...     def __init__(self):
...             A.__init__(self)
...             print('这里是B2')
...
>>> class C(B1, B2):
...     def __init__(self):
...             B1.__init__(self)
...             B2.__init__(self)
...             print('这里是C')
...
>>> c = C()
这里是A
这里是B1
这里是A
这里是B2
这里是C

A被调用了两次,因为C调用B1、B2,B1、B2又分别调用了A。

为了解决砖石继承的问题可以使用super()函数。

>>> class A:
...     def __init__(self):
...             print('这里是A')
...
>>> class B1(A):
...     def __init__(self):
...             super().__init__()
...             print('这里是B1')
...
>>> class B2(A):
...     def __init__(self):
...             super().__init__()
...             print('这里是B2')
...
>>> class C(B1, B2):
...     def __init__(self):
...             super().__init__()
...             print('这里是C')
...
>>> c = C()
这里是A
这里是B2
这里是B1
这里是C

六.多态

同一个运算符、函数或对象在不同的场景下具有不同的作用效果

运算符的多态

>>> 3 + 5
8
>>> 'L' + 'ove'
'Love'

函数的多态

>>> len('love')
4
>>> len(['love','jiji','xixi'])
3

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始读RocketMq源码(二)Message的发送详解

目录 前言 准备 消息发送方式 深入源码 消息发送模式 选择发送方式 同步发送消息 校验消息体 获取Topic订阅信息 高级特性-消息重投 选择消息队列-负载均衡 装载消息体发送消息 压缩消息内容 构造发送message的请求的Header 更新broker故障信息 异步发送消息 …

Open3D KDtree的建立与使用

目录 一、概述 1.1kd树原理 1.2kd树搜索原理 1.3kd树构建示例 二、常见的领域搜索方式 2.1K近邻搜索&#xff08;K-Nearest Neighbors, KNN Search&#xff09; 2.2半径搜索&#xff08;Radius Search&#xff09; 2.3混合搜索&#xff08;Hybrid Search&#xff09; …

ai native 模型微调

AI native 模型微调&#xff08;fine-tuning&#xff09;是指在预训练模型的基础上&#xff0c;通过对其参数进行进一步训练&#xff0c;使其在特定任务上表现更佳。以下是关于模型微调的一些基本步骤和概念&#xff1a; ### 1. 准备数据集 - **数据收集**&#xff1a;收集适用…

后端之路——登录校验前言(Cookie\ Session\ JWT令牌)

前言&#xff1a;Servlet 【登录校验】这个功能技术的基础是【会话技术】&#xff0c;那么在讲【会话技术】的时候必然要谈到【Cookie】和【Session】这两个东西&#xff0c;那么在这之前必须要先讲一下一个很重要但是很多人都会忽略的一个知识点&#xff1a;【Servlet】 什么是…

Oracle PL/SQL 循环批量执行存储过程

1. 查询存储过程 根据数据字典USER_OBJECTS查询出所有存储过程。 2. 动态拼接字符串&#xff08;参数等&#xff09; 根据数据字典USER_ARGUMENTS动态拼接参数。 3. 动态执行 利用EXECUTE IMMEDIATE动态执行无名块。 4. 输出执行信息 利用DBMS_OUTPUT.PUT_LINE输出执行成功与…

Android Gradle 开发与应用 (十): Gradle 脚本最佳实践

目录 1. 使用Gradle Kotlin DSL 1.1 什么是Gradle Kotlin DSL 1.2 迁移到Kotlin DSL 1.3 优势分析 2. 优化依赖管理 2.1 使用依赖版本管理文件 2.2 使用依赖分组 3. 合理使用Gradle插件 3.1 官方插件和自定义插件 3.2 插件管理的最佳实践 4. 任务配置优化 4.1 使用…

Oracle 19c 统一审计表清理

zabbix 收到SYSAUX表空间告警超过90%告警&#xff0c;最后面给出的清理方法只适合ORACLE 统一审计表的清理&#xff0c;传统审计表的清理SYS.AUD$不适合&#xff0c;请注意。 SQL> Col tablespace_name for a30 Col used_pct for a10 Set line 120 pages 120 select total.…

STM32实战篇:闪灯 × 流水灯 × 蜂鸣器

IO引脚初始化 即开展某项活动之前所做的准备工作&#xff0c;对于一个IO引脚来说&#xff0c;在使用它之前必须要做一些参数配置&#xff08;例如&#xff1a;选择工作模式、速率&#xff09;的工作&#xff08;即IO引脚的初始化&#xff09;。 IO引脚初始化流程 1、使能IO引…

LED灯的呼吸功能

"呼吸功能"通常是指 LED 灯的一种工作模式&#xff0c;它模拟人类的呼吸节奏&#xff0c;即 LED 灯的亮度会周期性地逐渐增强然后逐渐减弱&#xff0c;给人一种 LED 在"呼吸"的感觉。这种效果通常用于指示设备的状态或者简单地作为装饰效果。&#xff08;就…

Spring Boot Security自定义AuthenticationProvider

以下是一个简单的示例&#xff0c;展示如何使用AuthenticationProvider自定义身份验证。首先&#xff0c;创建一个继承自标准AuthenticationProvider的类&#xff0c;并实现authenticate方法。 import com.kamier.security.web.service.MyUser; import org.springframework.se…

【Adobe】Photoshop图层的使用

Adobe Photoshop(简称PS)中的图层是图像处理中一个核心概念,它允许用户以堆叠的方式组织图像的不同部分,从而实现对图像的复杂编辑和处理而不影响原始图像。以下是关于Adobe Photoshop图层的详细介绍: 一、图层的定义 图层就像是透明的纸张,你可以在上面绘制、添加图像…

YOLOv10改进 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余种损失函数

一、本文介绍 这篇文章介绍了YOLOv10的重大改进&#xff0c;特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体&#xff0c;如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU&#xff0c;还融合了“Focus”思想&#xff0c;创造了一系列新的损失函数。这些组合形式的…

Android Init Language自学笔记

Android Init Language由五个元素组成&#xff1a;Acttions、Commands、Services、Options和Imports。 Actions和Services隐式声明了一个新的section。所以的Commands和Options都属于最近声明的section。 Services具有唯一的名称&#xff0c;如果重名会报错。 Actions Acti…

解决Spring Boot中的高可用性设计

解决Spring Boot中的高可用性设计 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 高可用性设计概述 1.1 什么是高可用性&#xff1f; 高可用性指系统在面对各种故障和异常情况时&#xff0c;仍…

独立开发者系列(22)——API调试工具apifox的使用

接口的逻辑已经实现&#xff0c;需要对外发布接口&#xff0c;而发布接口的时候&#xff0c;我们需要能自己简单调试接口。当然&#xff0c;其实自己也可以写简单的代码调试自己的接口&#xff0c;因为其实就是简单的request请求或者curl库读取&#xff0c;调整请求方式get或者…

如果MySQL出现 “Too many connections“ 错误,该如何解决?

当你想要连接MySQL时出现"Too many connections" 报错的情况下&#xff0c;该如何解决才能如愿以偿呢&#xff1f;都是哥们儿&#xff0c;就教你两招吧&#xff01; 1.不想重启数据库的情况下 你可以尝试采取以下方法来解决&#xff1a; 增加连接数限制&#xff1a…

RxJava学习记录

文章目录 1. 总览1.1 基本原理1.2 导入包和依赖 2. 操作符2.1 创建操作符2.2 转换操作符2.3 组合操作符2.4 功能操作符 1. 总览 1.1 基本原理 参考文献 构建流&#xff1a;每一步操作都会生成一个新的Observable节点(没错&#xff0c;包括ObserveOn和SubscribeOn线程变换操作…

asp.netWebForm(.netFramework) CSRF漏洞

asp.netWebForm(.netFramework) CSRF漏洞 CSRF&#xff08;Cross-Site Request Forgery&#xff09;跨站请求伪造是一种常见的 Web 应用程序安全漏 洞&#xff0c;攻击者通过诱使已认证用户在受信任的网站上执行恶意操作&#xff0c;从而利用用户的身份 执行未经授权的操作。攻…

echarts实现3D饼图

先看下最终效果 实现思路 使用echarts-gl的曲面图&#xff08;surface&#xff09;类型 通过parametric绘制曲面参数实现3D效果 代码实现 <template><div id"surfacePie"></div> </template> <script setup>import {onMounted} fro…

简单的找到自己需要的flutter ui 模板

简单的找到自己需要的flutter ui 模板 网站 https://flutterawesome.com/ 简介 我原本以为会很难用 实际上不错 很简单 打开后界面类似于,右上角可以搜索 点击view github 相当简单 很oks