Python基础——类与对象

  类与对象的理解:

  在程序中我们将类看作是设计图纸,对象则是根据这个图纸生产的产品。面向对象编程就是使用对象编程,在类中我们定义成员属性和方法。

  来看下面这个例子,创建student类,定义对象并对属性赋值。

class Student:name=Noneage=Nonedef say_hai1(self):print(f'大家好,我是{self.name}')def say_hai2(self,msg):print(f'大家好,我是{self.name},{msg}')stu_1=Student()
stu_1.name='张三'
stu_1.say_hai1()stu_2=Student()
stu_2.name='王五'
stu_2.say_hai2('请多多关照')

构造方法:

 语法:__init__()构造方法,创建对象时参数自动传递给__init__()使用,注意构造方法也要使用self。

  在__init__方法里自动声明,前面可以不用先声明。

如下代码:


class Student:name=None  # 可省略age=None # 可省略def __init__(self,name,age):self.name=nameself.age=ageprint("构造函数执行完毕")stu=Student("iyizuohz",20)
print(stu.name)

 运行结果:

构造方法的练习:

  使用构造方法循环输入三个学生的姓名,年龄,地址,使输出结果如下,最后打印全部学生的信息。

思路: 

  在类中定义两个方法,一个用于循环输入学生信息,一个用来打印全部学生的信息,学生的信息通过列表来存储,其中学生的姓名等信息是字典的键值对形式。

代码:

class Student:def __init__(self):self.students = []  # 建立一个空列表用于存储学生信息for i in range(3):print(f"当前录入第{i+1}个学生的信息,总共需要录入3个学生的信息")name = input("请输入学生姓名:")age = input("请输入学生年龄:")address = input("请输入学生地址:")# 将学生信息以字典的形式存储到列表中self.students.append({'name': name, 'age': age, 'address': address})  # 存储学生信息print(f"学生{i+1}的信息录入成功,信息为:【学生姓名:{name},年龄:{age},地址:{address}】")def print_students(self):print("所有学生的信息如下:")for student in self.students:print(f"姓名:{student['name']}, 年龄:{student['age']}, 地址:{student['address']}")s = Student()
s.print_students()  # 打印所有学生的信息

以下代码是常见的错误写法

有以下几个错误原因:

1、属性引用错误:在 self.students.append 的字典中,应该访问 nameage 和 address 变量,而不是 self.nameself.age 和 self.address,因为这些变量仅在 for 循环的局部作用域中定义,并没有将它们作为类的属性进行存储。

2、函数参数:不需要写除了self以外的函数传递参数。

class Studet:def __init__(self, name, age, grade):self.name = nameself.age = agestudent1 = Studet("John", 18, 12)
print(student1)
print(str(student1))

魔术方法:

魔术方法(Magic Methods)是Python中的特殊方法,以双下划线开头和结尾,用于在类中定义特殊行为和操作。这些方法可以被Python解释器直接调用,而不需要显式地调用。

以下是一些常见的魔术方法及其功能:

  1. __init__(self, ...): 初始化方法,用于创建对象实例时进行初始化操作。

  2. __str__(self): 返回对象的字符串表示形式,可以通过内置函数str()print()调用。

  3. __repr__(self): 返回对象的可打印字符串表示形式,可以通过内置函数repr()调用。

  4. __len__(self): 返回对象的长度,可以通过内置函数len()调用。

这些魔术方法可以帮助我们定制类的行为,并在特定情况下自动调用相应的方法。

class Studet:def __init__(self, name, age, grade):self.name = nameself.age = ageself.grade = gradedef __str__(self):return f"Student类对象,name:{self.name}, age:{self.age}, grade:{self.grade}"student1 = Studet("John", 18, 12)
print(student1)

封装:

  现实生活中的属性和行为,对应类中的成员方法和成员变量。但这些属性和行为并不全对用户开放,如一部手机的运行电压,驱动信息并不能让用用户来操作,所以我们需要提供私有成员的形式来支持。

  例如,以下代码定义了一个名为Person的类,其中包含了一个私有属性和一个私有方法:

class Person:def __init__(self, name, age):self.__name = nameself.__age = agedef __display(self):print("Name: {}, Age: {}".format(self.__name, self.__age))

  注意类中内部的成员可以访问私有  。

 练习:

  打电话时,用户不用检查5G状态,而由程序内部检查,但需要告诉用户当前是否在使用5G通话。

  即将检查5G的函数定义为私有,将打电话的函数定义为公有。

class Phone:__is_5g_enabled =   Falsedef __check_5g(self):if self.__is_5g_enabled:print("5G开启")return Trueelse:print("5G关闭,使用4G网络")return Falsedef call_by_5g(self):if self.__check_5g():print("正在使用5G网络通话")else:print("正在使用4G网络通话")phone = Phone()
phone.call_by_5g()

继承:

 单继承:

  看以下例子,其中 Phone 是一个基础类,提供了通过4G拨打电话的方法。NewPhone 是 Phone 的子类,新增了一个通过5G拨打电话的方法,在newPhone中,依旧可以调用4G拨打电话的方法。

# 单继承
class Phone:IMEI=Noneproducer=Nonedef call_by_4G(self):print("Calling by 4G")class   NewPhone(Phone):face_id=10002def call_by_5G(self):print("Calling by 5G")p1=NewPhone()
p1.call_by_4G()
p1.call_by_5G()
 多继承:

  多继承对于父类同名的成员,优先级从左至右。

class Phone:IMEI=Noneproducer='USA'def call_by_4G(self):print("Calling by 4G")class NFCReader:nfc_id=Noneproducer = 'CHINA'def read_nfc_id(self):print("Reading NFC ID")def write_nfc_id(self):print("Writing NFC ID")class XiaomiPhone(Phone,NFCReader):# 不再创建新的功能,使用pass语句pass # 空语句,表示不实现任何功能phone = XiaomiPhone()
phone.call_by_4G()
print(phone.producer) # 'USA'
复写:

  如果子类对父类的属性或方法不满意,可以进行重写,直接修改即可。

class Phone:IMEI=Noneproducer='USA'def call_by_4G(self):print("Calling by 4G")class NFCReader:nfc_id=Noneproducer = 'CHINA'def read_nfc_id(self):print("Reading NFC ID")def write_nfc_id(self):print("Writing NFC ID")class XiaomiPhone(Phone,NFCReader):producer = 'ENGLAND'def call_by_4G(self):print("cutting electricity to call")print("Calling by 4G")phone = XiaomiPhone()
phone.call_by_4G()
print(phone.producer) # 'USA'# 如果使用

  如果还想继续使用父类的成员,有两种方式,直接通过父类名调用或者通过super()调用

代码演示

class Phone:IMEI=Noneproducer='USA'def call_by_4G(self):print("Calling by 4G")class XiaomiPhone(Phone):def call_by_4G(self):print("cutting electricity to call")# 调用父类的成员和方法#法一:直接通过父类名调用print(f"调用父类{Phone.producer}")Phone.call_by_4G(self)# 传入self#法二:通过super()调用print(f"调用父类{super().producer}")super().call_by_4G() # 不用传入selfphone = XiaomiPhone()
phone.call_by_4G()# 如果使用

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

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

相关文章

解决linux服务器磁盘占满问题(详细,有效,100%解决)

应用场景: 在我们的日常开发中,我们的服务器总是在不知不觉中磁盘莫名奇妙少了很多空间,或者被占满了,如果这时候要想要存储什么文件,突然发现空间不够了。但我们通常也不知道那些文件占用的空间大,这时候…

Vue是一套构建用户界面的渐进式框架,常用于构建单页面应用

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

红黑树的理解与实现(详解)

相关的数据结构: 搜索二叉树-CSDN博客 AVL树的创建与检测-CSDN博客 个人主页:敲上瘾-CSDN博客 个人专栏:游戏、数据结构、c语言基础、c学习、算法 目录 一、红黑树规则: 二、红黑树的插入 1.变色 2.单旋变色 3.双旋变色 三、…

WebGoat SQL Injection (intro) 源码分析

首先了解 java 中 mysql 的连接:java连接Mysql WebGoat SQL Injection (intro) 10 根据提示:下面两个输入框只有一个受到 sql 注入攻击。题目要求是检索到所有数据 发现请求路径为 SqlInjection/assignment5b 定位到所在文件如下,根据代码…

【uniapp】使用Promise封装request

目录 1、创建config目录 2、创建settings.js 3、创建目录utils 4、创建request.js 5、创建api目录 6、创建apis.js文件 7、业务系统调用 7.1 业务系统banner 7.2 业务系统荣誉页面(传参) 前言:使用Promise封装request 1、创建config…

UNIX网络编程-传输层

概述 传输层主要包括:TCP、UDP、SCTP(流控制传输协议)! 绝大多数客户端/服务器网络应用都使用TCP/UDP。SCTP是一个较新的协议,最初设计用于跨因特网传输电话信令。 这些传输协议都转而使用网络协议IP:或是…

2023年华为杯数学建模竞赛题F论文和代码

强对流降水临近预报建模与优化 对问题一,为了实现基于前一小时(10帧)的实测雷达观测量(ZH、ZDR、KDP),对后续一小时(10帧)的ZH进行预报,本文首先建立了线性拟合与RMSE双驱…

matlab相位图

% 清空工作空间和命令窗口 clear; clc; % 模拟生成时间t,位移y(t)和角位移theta(t) t linspace(0, 100, 1000); % 时间从0到100,包含1000个点 y 1e-5 * sin(2 * pi * 0.1 * t) .* exp(-0.01 * t); % 位移y(t) 振荡衰减 theta 1e-6 * cos(2 * pi * …

Qt第十三天:网络编程:TCP和UDP的使用

我发现了有些人喜欢静静看博客不聊天呐, 但是ta会点赞。 这样的人呢帅气低调有内涵, 美丽大方很优雅。 说的就是你, 不用再怀疑哦 ❤️TCP: 一、创建项目,命名为Server,继承QWidget 二、添加Qt设计师…

如何进行数学家式的学习思考?

如何进行数学家式的学习思考? 学生阶段的数学学习是非常重要的,对这一点很少有人质疑。一提起数学学习,一些学生、家长甚至一些教师认为,学生的数学学习往往侧重于掌握基本概念、公式和解题技巧,通过做题来巩固知识和提…

【飞腾加固服务器】全国产化解决方案:飞腾FT2000+/64核,赋能关键任务保驾护航

在信息安全和自主可控的时代背景下,国产化设备的需求与日俱增,尤其是在国防、航空航天、能源和其他关键行业。高可靠性和极端环境设计的国产加固服务器,搭载强大的飞腾FT2000/64核处理器,全面满足国产自主可控的严苛要求。 性能强…

【Linux探索学习】第六弹——Linux的工具(一):Ubuntu系统下的软件包管理器

前言: 在Ubuntu系统中,Linux工具为用户提供了强大的命令行操作能力。这些工具不仅使日常任务的自动化成为可能,还大幅提升了生产力。本文将重点介绍一些常用的Linux工具:软件包管理器 注意:本文是所讲解的内容是在Ubun…

【C++基础篇】——逐步了解C++

【C基础篇】——逐步了解C 文章目录 【C基础篇】——逐步了解C前言一、C的第一个程序二、命名空间1.namespace的价值2.namespace的定义3.命名空间的使用 三、C的输入&输出四、缺省参数五、函数重载六、引用1.引用的概念和定义:2.引用的特性3.引用的使用4.const引…

使用LangGraph构建多Agent系统架构!

0 前言 Agent是一个使用大语言模型决定应用程序控制流的系统。随着这些系统的开发,它们随时间推移变得复杂,使管理和扩展更困难。如你可能会遇到: Agent拥有太多的工具可供使用,对接下来应该调用哪个工具做出糟糕决策上下文过于…

51单片机的超声波视力保护仪【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器光照传感器超声波传感器按键、LED、蜂鸣器等模块构成。适用于视力保护仪、坐姿矫正器、超声波防近视等相似项目。 可实现功能: 1、LCD1602显示温度、光照、距离和学习时间 2、超声波传感器采集头部与探…

【计算机网络】HTTP报文详解,HTTPS基于HTTP做了哪些改进?(面试经典题)

HTTP协议基本报文格式 在计算机网络中,HTTP(超文本传输协议)是应用层的一种协议,用于客户端(通常是浏览器)和服务器之间的通信。HTTP报文分为请求报文和响应报文,以下是它们的基本格式。 1. H…

基于Java微信小程序的水果销售系统详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

PyTorch 介绍

什么是 PyTorch PyTorch 是一个开源的机器学习库,广泛用于计算机视觉和自然语言处理等应用。它由 Facebook 的人工智能研究团队开发,并得到了许多其他机构和个人的贡献。PyTorch 以其易用性、灵活性和动态计算图(也称为自动微分系统&#xf…

Nexpose 6.6.273 发布,新增功能概览

Nexpose 6.6.273 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, released Oct 10, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 您的本地…

python学习-怎么在Pycharm写代码

打开Pycharm,点击文件-新建项目 2.选择pure python-点击箭头 展开 3.选择 Existing interpreter 如果 Existing interpreter 下没有相关环境 (1)点击**…** (2)选择python的安装路径 4.可修改文件名称-点击创建 …