当前位置: 首页 > news >正文

Python 无废话-基础知识面向对象编程详解

类定义

如何理解万物皆对象

生活中一些事物,动物(可爱的小狗、调皮的小猫)、交通工具比亚迪U8汽车、飞机)、人(学生、教师)

这些对象都有着独特或共性的属性和方法来描述其特征和行为

类定义

将上述图片可以分类,动物类、交通工具类、人类……

类是一种用来创建对象的蓝图或模板,定义了对象的属性和方法,并通过实例化来创建具体的对象

作用:使代码更加模块化、可维护和可扩展

通过定义类,则可以创建多个具有相同属性和方法的对象,这些对象被称为类的实例。例如,定义一个名为“Person”的类,然后创建多个不同的人的实例,如学生、教师、校长、主任……

定义类的语法结构

class ClassName:

         # 类属性

         name=“test”

        # 初始化方法

         def __init__(self, parameters):

        # 类方法

        def method_name(self, parameters):

语法解析

1)关键字 class 用于定义一个类,后面紧跟着类名 ClassName
2)类 名通常使用首字母大写的驼峰命名法来命名,以区别于变量和函数名

      3)在类体中,可以定义类的属性和方法

       4)类属性是属于类本身的属性,可以被所有该类的实例共享

5)方法 是类的函数,用于定义类的行为和功能 ( 函数在类里面称为方法 )

体中的 __init__() 方法是一个特殊的方法,也被称为构造方法或初始化方法,它在创建对象时被自动调用, self 参数代表当前对象本身,用于引用对象的属性和方法。其他参数用于接受传递给初始化方法的值

类定义示例

示例定义一个人类,当然也可以定义动物类、交通工具类……

class Person:

    def __init__(self, name, age):

        self.name = name

        self.age = age

    def say_hello(self):

        print("Hello, my name is", self.name)

        print("I am", self.age, "years old.")

# 创建一个Person类的实例,李小龙是人类的一个对象,还可以创建张三、李四……

person = Person(“李小龙", 80)

# 访问实例的属性

print(person.name) # 输出:李小龙

print(person.age)  # 输出80

# 调用实例的方法

person.say_hello()

 # 输出:Hello, my name is李小龙

 # I am 80 years old.

以订单管理系统为例,创建一个名为“Order”的类,订单对象具有订单号、客户姓名和订单金额等属性,同时具有处理支付、生成发票和发送确认邮件等方法,示例如下:

class Order:

    def __init__(self, order_id, customer_name, total_amount):

        self.order_id = order_id

        self.customer_name = customer_name

        self.total_amount = total_amount

    def process_payment(self):

        print(f"正在处理订单 {self.order_id} 的支付,付款金额为 {self.total_amount}")

        # 具体的支付逻辑

    def generate_invoice(self):

        print(f"正在生成订单 {self.order_id} 的发票")

        # 具体的发票生成逻辑    

    def send_confirmation_email(self):

        print(f"正在向客户 {self.customer_name} 发送订单 {self.order_id} 的确认邮件")

        # 具体的邮件发送逻辑

创建对象

创建对象也称为类的实例化。

#创建对象

my_order = Order("20231006", "李四", 10000)

#调用处理订单方法

my_order.process_payment()

#生成订单方法

my_order.generate_invoice()

#发送邮件

my_order.send_confirmation_email()

类的属性值修改

修改类属性的值,有以下几种方法

  1. 直接通过类名访问和修改属性

  class classTest:

        attribute = "old value"

classTest.attribute = "new value"

  1.   2. 通过类的实例访问和修改属性

 class classTest:

    def __init__(self):

        self.attribute = "old value"

obj = classTest()

obj.attribute = "new value "

3. 通过类的方法访问和修改属性

class Person:

    def __init__(self, name, age):

        self.name = name

        self.age = age

    def introduce(self):

        print(f"My name is {self.name} and I am {self.age} years old.")

    def change_name(self, new_name):

        self.name = new_name

    def change_age(self, new_age):

        self.age = new_age

# 创建一个Person对象

person = Person("李四", 18)

# 打印初始属性值

person.introduce()

# 使用类的方法修改属性值

person.change_name(“李小龙")

person.change_age(80)

# 打印修改后的属性值

person.introduce()

类的继承

类继承是面向对象编程的重要特征之一,一个类可以继承另一个类的属性和方法,并且可以在其基础上进行扩展和修改。

我们把继承看作成是子类继承父类,如果一个子类继承了父类,那么该子类就拥有了父类的属性和方法。

比如人类,有2只手,2只腿,一双眼,会说话,会走路,学生类继承人类,那学生类的实例对象就拥有了这些属性和方法。

单继承

一个类只能继承自一个父类。在定义类时,可以在类名后面使用括号指定继承的父类

class ParentClass:

    pass

class ChildClass(ParentClass):

    pass

多继承

一个类可以同时继承多个父类。在定义类时,可以在括号中使用逗号分隔多个父类。

class ParentClass1:

    pass

class ParentClass2:

    pass

class ChildClass(ParentClass1, ParentClass2):

    pass

继承示例

类的多态

可以使用多态来重写父类的方法。它允许子类对继承自父类的方法进行重写,并根据不同的子类对象执行不同的行为。

怎样实现多态?

要实现多态,首先需要创建一个父类,定义一个或多个方法。在子类中重写这些方法,以实现自定义的行为。子类可以根据需要修改方法的输入参数、输出结果或内部实现逻辑。

class Animal:

    def make_sound(self):

        pass

class Dog(Animal):

    def make_sound(self):

        print("小狗是汪汪汪!")

class Cat(Animal):

    def make_sound(self):

        print("小猫是喵喵喵!")

class Cow(Animal):

    def make_sound(self):

        print("老黄牛是哞哞哞!")

# 创建对象并调用方法

animals = [Dog(), Cat(), Cow()]

for animal in animals:

    animal.make_sound()

的方法重载

可以使用多态来重写父类的方法。它允许子类对继承自父类的方法进行重写,并根据不同的子类对象执行不同的行为。

怎样实现多态?

要实现多态,首先需要创建一个父类,定义一个或多个方法。在子类中重写这些方法,以实现自定义的行为。子类可以根据需要修改方法的输入参数、输出结果或内部实现逻辑。

注意:python 不直接支持方法重载,如果要实现重载需要借助默认参数来实现。

class Calculator:

    def add(self, a, b=None, c=None):

        if c is not None:

            return a + b + c

        elif b is not None:

            return a + b

        else:

            return a

# 创建对象并调用方法

calculator = Calculator()

result1 = calculator.add(2)

print(result1)  # 输出: 2

result2 = calculator.add(2, 3)

print(result2)  # 输出: 5

result3 = calculator.add(2, 3, 4)

print(result3)  # 输出: 9

入单类 

Order.py 文件 包含Order

class Order:

    def __init__(self, order_id, customer_name, total_amount):

        self.order_id = order_id

        self.customer_name = customer_name

        self.total_amount = total_amount

    def process_payment(self):

        print(f"正在处理订单 {self.order_id} 的支付,付款金额为 {self.total_amount}")

        # 具体的支付逻辑

    def generate_invoice(self):

        print(f"正在生成订单 {self.order_id} 的发票")

        # 具体的发票生成逻辑

    def send_confirmation_email(self):

        print(f"正在向客户 {self.customer_name} 发送订单 {self.order_id} 的确认邮件")

        # 具体的邮件发送逻辑

 Customer.py 文件

#import语句让Python 打开模块Order并导入中其中的Order

from Order import Order

order=Order("T20231006002","李小龙",10000)

order.process_payment()

多个

Customer.py 文件

#import语句让Python 打开模块Order并导入中其中的Order, OnlineOrder

from Order import Order ,OnlineOrder

order=Order("T20231006002","李小龙",10000)

order.process_payment()

ol=OnlineOrder("20231006003", "李四", 10000, "广州", "2023-10-06")

ol.process_payment()

整个模块

Customer.py 文件

#import语句Python 打开模块Order并导入所有模块

import Order

使用别名

#import语句Python 打开模块Order并导入所有模块,别为or

import Order as or

使用示例

cus=or.OnlineOrder("20231006003", "李四", 10000, "广州", "2023-10-06")

相关文章:

Python 无废话-基础知识面向对象编程详解

类定义 如何理解万物皆对象? 生活中一些事物,动物(可爱的小狗、调皮的小猫)、交通工具(比亚迪U8汽车、飞机)、人(学生、教师)…… 这些对象都有着独特或共性的属性和方法来描述其…...

凉鞋的 Unity 笔记 106. 第二轮循环场景视图Sprite Renderer

106. 第二轮循环&场景视图&Sprite Renderer 从这一篇开始,我们开始进行第二轮循环。 这次我们至少能够在游戏运行窗口看到一些东西。 首先还是在场景层次窗口进行编辑,先创建一个 Sprite,操作如下: 创建后,会在 Scene …...

Vue中如何进行分布式路由配置与管理

Vue中的分布式路由配置与管理 随着现代Web应用程序的复杂性不断增加,分布式路由配置和管理成为了一个重要的主题。Vue.js作为一种流行的前端框架,提供了多种方法来管理Vue应用程序的路由。本文将深入探讨在Vue中如何进行分布式路由配置与管理&#xff0…...

Solidity 合约漏洞,价值 38BNB 漏洞分析

Solidity 合约漏洞,价值 38BNB 漏洞分析 1. 漏洞简介 https://twitter.com/NumenAlert/status/1626447469361102850 https://twitter.com/bbbb/status/1626392605264351235 2. 相关地址或交易 攻击交易: https://bscscan.com/tx/0x146586f05a451313…...

【C++】:类和对象(2)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…...

【GIT版本控制】--提交更改

一、添加文件到暂存区 在GIT中,要提交更改,首先需要将文件添加到暂存区(Staging Area)。这是一个用于存放将要提交的更改的临时区域。以下是将文件添加到暂存区的步骤: 打开终端或命令提示符:首先&#x…...

解决高分屏DPI缩放PC端百度网盘界面模糊的问题

第一步 更新最新版本 首先,在百度网盘官网下载最新安装包: https://pan.baidu.com/download 进行覆盖安装 第二步 修改兼容性设置 右键百度网盘图标,点击属性,在兼容性选项卡中点击更改所有用户的设置 弹出的选项卡中选择更改高…...

全能视频工具 VideoProc Converter 4K for mac中文

VideoProc 4K提供快速完备的4K影片处理方案,您可以透过这款软体调节输出影片格式和大小。能够有效压缩HD/4K影片体积90%以上,以便更好更快地上传到YouTube,或是通过电子邮件附件发送。业界领先的视讯压缩引擎,让你轻松处理大体积视…...

Vue中实现自定义编辑邮件发送到指定邮箱(纯前端实现)

formspree里面注册账号 注册完成后进入后台新建项目并且新建表单 这一步完成之后你将得到一个地址 最后就是在项目中请求这个地址 关键代码如下: submitForm() {this.fullscreenLoading true;this.$axios({method: "post",url: "https://xxxxxxx…...

计算机专业毕业设计项目推荐11-博客项目(Go+Vue+Mysql)

博客项目(GoVueMysql) **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&am…...

QT实现TCP

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);// 此时,服务器已经成功进入监听状态&#xff0c…...

PostgreSQL ash —— pgsentinel插件

一、 插件作用 众所周知,pg是没有像oracle那样的ash视图的,因此要回溯历史问题不太方便。pgsentinel插件会将pg_stat_activity与pg_stat_statements视图内容定期快照,并存入pg_active_session_history和pg_stat_statements_history视图中。 1…...

【刷题笔记10.5】LeetCode:排序链表

LeetCode:排序链表 一、题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 二、分析 这题咱们默认要求:空间复杂度为O(1)。所以这把咱们用自底向上的方法实现归并排序,则可以达到O(1) 的空间复杂…...

三、【色彩模式与颜色填充】

文章目录 Photoshop常用的几种颜色模式包括:1. RGB模式2. CMYK模式3. 灰度模式4. LAB模式5. 多通道模式 Photoshop颜色填充1.色彩基础2.拾色器认识3.颜色填充最后附上流程图: Photoshop常用的几种颜色模式包括: 1. RGB模式 详细可参考&…...

karmada v1.7.0安装指导

前言 安装心得 经过多种方式操作,发现二进制方法安装太复杂,证书生成及其手工操作太多了,没有安装成功;helm方式的安装,v1.7.0的chart包执行安装会报错,手工修复了报错并修改了镜像地址,还是各…...

OK3568 forlinx系统编译过程及问题汇总

1. 共享文件夹无法加载;通过网上把文件夹加载后,拷贝文件很慢,任务管理器查看发现硬盘读写速率很低。解决办法:重新安装vmware tools。 2. 拷贝Linux源码到虚拟机,解压。 3. 虚拟机基本库安装 forlinxubuntu:~$ sudo…...

JVM篇---第五篇

系列文章目录 文章目录 系列文章目录一、简述Java的对象结构二、如何判断对象可以被回收?三、JVM的永久代中会发生垃圾回收么?一、简述Java的对象结构 Java对象由三个部分组成:对象头、实例数据、对齐填充。 对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码…...

C/C++ 排序算法总结

1.冒泡排序 https://blog.csdn.net/weixin_49303682/article/details/119365319 1 #include <stdio.h>2 3 #define N 94 5 void print(int a[])6 {7 for(int i 0; i < N; i)8 {9 printf("%d ", a[i]); 10 } 11 printf("…...

机器学习---RBM、KL散度、DBN

1. RBM 1.1 BM BM是由Hinton和Sejnowski提出的一种随机递归神经网络&#xff0c;可以看做是一种随机生成的 Hopfield网络&#xff0c;是能够通过学习数据的固有内在表示解决困难学习问题的最早的人工神经网络之 一&#xff0c;因样本分布遵循玻尔兹曼分布而命名为BM。BM由二…...

(c语言)有序序列合并

#include<stdio.h>//输入包含三行 //第一行包含两个正整数n,m&#xff0c;用空格分割,n表示第二行第一个升序序列中 //数字的个数,m表示第三行第二个升序序列中数字的个数 //第二行包含n个整数&#xff0c;用空格分割 //第三行包含m个整数&#xff0c;用空格分割 //输出…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...