Python基础——类与对象

news2024/10/19 0:25:09

  类与对象的理解:

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

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

class Student:
    name=None
    age=None
    def 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=name
        self.age=age
        print("构造函数执行完毕")

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 = name
        self.age = age

student1 = 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 = name
        self.age = age
        self.grade = grade
    def __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 = name
        self.__age = age
        
    def __display(self):
        print("Name: {}, Age: {}".format(self.__name, self.__age))
 

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

 练习:

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

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

class Phone:
    __is_5g_enabled =   False
    def __check_5g(self):
        if self.__is_5g_enabled:
            print("5G开启")
            return True
        else:
            print("5G关闭,使用4G网络")
            return False
    def 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=None
    producer=None

    def call_by_4G(self):
        print("Calling by 4G")

class   NewPhone(Phone):
    face_id=10002
    def call_by_5G(self):
        print("Calling by 5G")

p1=NewPhone()
p1.call_by_4G()
p1.call_by_5G()
 多继承:

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

class Phone:
    IMEI=None
    producer='USA'
    def call_by_4G(self):
        print("Calling by 4G")

class NFCReader:
    nfc_id=None
    producer = '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=None
    producer='USA'
    def call_by_4G(self):
        print("Calling by 4G")

class NFCReader:
    nfc_id=None
    producer = '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=None
    producer='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() # 不用传入self

phone = XiaomiPhone()
phone.call_by_4G()


# 如果使用

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

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

相关文章

Golang | Leetcode Golang题解之第480题滑动窗口中位数

题目: 题解: type hp struct {sort.IntSlicesize int } func (h *hp) Push(v interface{}) { h.IntSlice append(h.IntSlice, v.(int)) } func (h *hp) Pop() interface{} { a : h.IntSlice; v : a[len(a)-1]; h.IntSlice a[:len(a)-1]; return v }…

十大云手机排行榜:哪个云手机更好用?

近些年,市场上涌现出许多云手机产品,不同产品适合的应用场景也各不相同。在选用云手机之前,企业和个人用户需要了解它们的功能、特点以及适用的场景。本文将对当前主流的云手机进行对比,帮助大家挑选出最适合的云手机产品。 1. 红…

200Kg大载重多旋无人机价格高昂技术分析

200Kg大载重多旋无人机作为一种高度专业化的航空工具,其价格相较于普通无人机显著较高,这主要是由于其在技术设计和生产过程中所需的高要求所致。以下是对其价格高昂的技术分析: 一、高性能材料与结构设计 1. 高强度轻量化材料:…

KafKa 集群【docker compose】

文章目录 主机准备部署编辑 docker-compose.ymlcontrollerbroker生成cluster_id 一篇完整的 docker-compose.yml 文件查看集群状态使用 kafka-ui 查看拉取 kafka-ui添加集群查看集群状态 使用命令行查看 配置讲解controllerbroker 主机准备 IPcontroller idbroker id192.168.1…

FreeRTOS的队列管理

“队列”提供了一种任务到任务、任务到中断和中断到任务的通信机制。 队列特性 数据存储 队列可以容纳有限数量的固定大小的数据项。队列可以容纳的最大项目数称为其“长度”。每个数据项的长度和大小都是在创建队列时设置的。 队列通常用作先进先出(FIFO&#xf…

游戏逆向基础-跳出游戏线程发包

附加游戏后下断点 bp ws2_32.send send函数断下后,可以看到数据地址每次都一样 可以说明这个游戏是线程发包,所以直接在数据窗口中转到这个地址,然后对这个地址下硬件写入断点。 下了硬件写入断点后可以一层一层往上面跟,确定写…

RHCE--at,crontab例行性工作

一:安装at (1)配置yum仓库:以配置网络源举例: 先在/etc/yum.repos.d/ 目录下创建一个以.repo结尾的文件 vim /etc/yum.repos.d/aliyun.repo 写入可以在阿里云镜像站查找appstream和baseos的地址阿里巴巴开源镜像站…

tensorflow案例2--猴痘病识别,一道激活函数的bug

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 文章目录 1、bug2、模型构建1、数据处理1、导入库2、查看数据目录3、加载数据4、数据展示 2、内存优化3、模型构建4、模型训练1、超参数设置2、模型训练 5、结…

通过前端UI界面创建VUE项目

通过前端UI界面创建VUE项目,是比较方面的一种方式,下面我们详细分析一下流程: 1、找到合适目录 右键鼠标,点击在终端打开 2、开始创建 输入 vue ui 浏览器弹出页面 3、点击Create项目 显示已有文件列表,另外可以点击…

Docker部署一款小巧又强大的的自托管网站监控工具Uptime Kuma

文章目录 前言1.关于Uptime Kuma2.安装Docker3.本地部署Uptime Kuma4.使用Uptime Kuma5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&#…

CVE-2024-36971漏洞修复----Debian 10.13 内核升级

CVE-2024-36971漏洞修复---Debian 10.13 内核升级 1. 下载内核2. 安装依赖包3. 二进制安装3.1 上传3.2 解压3.3 修改配置文件3.4 编译3.5 安装内核及模块 4. 重启服务器并确认升级成功 1. 下载内核 到kernel.org下载新版的Kernel 由于开发那边不想让Kernel跨大版本,所以就升级…

【优选算法】——双指针(上篇)!

🌈个人主页:秋风起,再归来~🔥系列专栏:C刷题算法总结🔖克心守己,律己则安 目录 前言:双指针 1. 移动零(easy) 2. 复写零(easy) 3…

VSCode C/C++跳转到定义、自动补全、悬停提示突然失效

昨天像往常一样用vscode连接云服务器写代码,突然发现跳转到定义、自动补全、悬停提示功能全部不能正常使用了,今天折腾了一上午,看了一大堆教程,最后可算是解决了,因为大家说不定会遇到和我一样的问题,所以…

【工具篇】MLU运行XInference部署手册

文章目录 前言一、平台环境准备二、代码下载三、安装部署1.正常pip 安装 四、运行结果展示1.如果界面404或没有东西请这样做2.运行效果 前言 Xorbits Inference(Xinference)是一个功能强大、用途广泛的库,旨在为语言、语音识别和多模态模型提…

自监督学习:引领机器学习的新革命

引言 自监督学习(Self-Supervised Learning)近年来在机器学习领域取得了显著进展,成为人工智能研究的热门话题。不同于传统的监督学习和无监督学习,自监督学习通过利用未标注数据生成标签,从而大幅降低对人工标注数据…

数据库-01MYSQL-001MySQL知识点查漏补缺

MySQL知识点查漏补缺 数据库常识不常见知识点: 数据库常识 知识点001: between…and … 包含临界值。 知识点002:任何内容与null相加等于null。 知识点003:模糊查询涉及的函数有:like,between…and…, in/…

机器的“眼睛“:计算机视觉技术背后的魔法

计算机视觉,作为人工智能领域中的一颗璀璨明珠,正逐步改变着我们的生活方式。它赋予了机器“看”的能力,使得计算机能够从图像和视频中提取信息并进行分析,就像人类用眼睛和大脑来理解世界一样。本文将带你走进计算机视觉的世界&a…

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

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

ANSYS Workbench纤维混凝土3D

在ANSYS Workbench建立三维纤维混凝土模型可采用CAD随机几何3D插件建模后导入,模型包含球体粗骨料、圆柱体长纤维、水泥砂浆基体等不同组分。 在CAD随机几何3D插件内设置模型参数后运行,即可在AutoCAD内建立三维纤维混凝土模型,插件支持任意…

牛客习题—线性DP 【mari和shiny】C++

你好,欢迎阅读我的文章~ 个人主页:Mike 所属专栏:动态规划 mari和shiny mari和shiny ​ 分析: 使用动态规划的思路来解决。 思路: 分别统计s,sh,shy的数量即可。使用ss来统计字符s的数量,使…