挑战30天学完Python:Day21 类和对象

2024-02-26 05:44

本文主要是介绍挑战30天学完Python:Day21 类和对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🎉 本系列为Python基础学习,原稿来源于 30-Days-Of-Python 英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过30天完成正儿八经的系统化实践。此系列适合零基础同学,或仅了解Python一点知识,但又没有系统学习的使用者。总之如果你想提升自己的Python技能,欢迎加入《挑战30天学完Python》

📘 Day 21

  • 类和对象
    • 创建类
    • 创建对象
    • 类构造函数
    • 对象方法
    • 对象默认方法
    • 用方法修改类的默认值
    • 继承
    • 重写父方法
  • 💻 第21天练习
    • 练习1级
    • 练习2级

📘 Day 21

类和对象

Python是一种面向对象的编程语言。Python中的所有东西都是一个对象,包括它的属性和方法。程序中使用的数字、字符串、列表、字典、元组、集合等都是相应内置类对象。我们创建类来创建对象。类,类似于对象构造函数,或者创建对象的“蓝图”。我们实例化一个类来创建一个对象。类定义对象的属性和行为,而另一方面,对象表示类。

从接受这个系列挑战开始,我们就在不知不觉中使用类和对象。Python程序中的每个元素都是类的对象。让我们检查一下python中的所有内容是否都是类:

> python
>>> num = 10
>>> type(num)
<class 'int'>
>>> string = 'string'
>>> type(string)
<class 'str'>
>>> boolean = True
>>> type(boolean)
<class 'bool'>
>>> lst = []
>>> type(lst)
<class 'list'>
>>> tpl = ()
>>> type(tpl)
<class 'tuple'>
>>> set1 = set()
>>> type(set1)
<class 'set'>
>>> dct = {}
>>> type(dct)
<class 'dict'>

创建类

要创建一个类,我们需要使用关键词 class 然后后边跟着名字和冒号,类的名字建议使用驼峰命名法。

# 语法形式
class ClassName:这里编写代码

举例:

class Person:pass
print(Person)
<class '__main__.Person'>

创建对象

我们可以通过调用初始化类来创建对象。

p = Person()
print(p)
# <__main__.Person object at 0x000002084C138490>

类构造函数

在上面的例子中,我们已经从Person类创建了一个对象。然而,没有构造函数的类,在实际应用程序中并没有真正的用处。让我们使用构造函数函数使我们的类更有用。与Java或JavaScript中的构造函数类似,Python也有内置的 __init__() 构造函数。init 构造函数带有self形参,它表示类的当前实例的引用。

例子:

class Person:def __init__ (self, name):self.name =namep = Person('MegaQi')
print(p.name)
print(p)

输出

MegaQi
<__main__.Person object at 0x000002DA62D18490>

让我们在构造函数中再添加一些参数

class Person:def __init__(self, firstname, lastname, country, city):self.firstname = firstnameself.lastname = lastnameself.country = countryself.city = cityp = Person('Mega', 'Qi', 'China', 'ShangHai')
print(p.firstname)
print(p.lastname)
print(p.country)
print(p.city)

输出

Mega
Qi
China
ShangHai

对象方法

对象可以有方法。方法属于对象的函数。

举例:

class Person:def __init__(self, name, country, city):self.name = nameself.country = countryself.city = citydef person_info(self):return f'{self.name} 居住在{self.country} {self.city}'p = Person('Qi','中国', '上海')
print(p.person_info())
# Qi 居住在中国 上海

对象默认方法

有时候,你可能想为你的对象方法设置一个默认值。如果在构造函数中为形参指定默认值,就可以避免在不带形参的情况下调用或实例化类时出现错误。让我们看看它是什么样子的:

class Person:def __init__(self, name='Qi', country='中国', city='上海'):self.name = nameself.country = countryself.city = citydef person_info(self):return f'{self.name} 居住在{self.country} {self.city}'p1 = Person()
print(p1.person_info())
p2 = Person('MeagaQi', '法国', '巴黎')
print(p2.person_info())

输出

# 默认给定参值
Qi 居住在中国 上海
# 指定参数值
MeagaQi 居住在法国 巴黎

用方法修改类的默认值

在下面的例子person类中,所有构造函数参数都有默认值。除此之外,我们还添加了一个技能参数,我们可以使用方法访问和修改它,比如向其中添加新的技能。

class Person:def __init__(self, name='Qi',country='China'):self.name = nameself.country = countryself.skills = []def person_info(self):return f'{self.name} 住在 {self.country} 我的新技能树有 {self.skills}'def add_skill(self, skill):self.skills.append(skill)class Student(Person):passs1 = Student('MegaQi', 'China')
s2 = Student('Tom', 'Finland')print(s1.person_info())
s1.add_skill('JavaScript')
s1.add_skill('React')
s1.add_skill('Python')
print(s1.skills)print(s2.person_info())
s2.add_skill('Organizing')
s2.add_skill('Marketing')
s2.add_skill('Digital Marketing')
print(s2.skills)p = Person()
print(p.person_info())
p.add_skill('HTML')
p.add_skill('CSS')
p.add_skill('JavaScript')
print(p)
print(p.person_info())
print(p.skills)

输出

Qi 住在 China 我的新技能树有 []
<__main__.Person object at 0x0000023202118490>
Qi 住在 China 我的新技能树有 ['HTML', 'CSS', 'JavaScript']
['HTML', 'CSS', 'JavaScript']

继承

继承允许我们定义一个从父类继承所有方法和属性的类。父类或基类是提供所有方法和属性的类。子类是继承自另一个类或父类的类。

让我们通过继承 person 类来创建一个 student 类。

class Student(Person):passs1 = Student('MegaQi', 'China')
s2 = Student('Tom', 'Finland')print(s1.person_info())
s1.add_skill('JavaScript')
s1.add_skill('React')
s1.add_skill('Python')
print(s1.skills)print(s2.person_info())
s2.add_skill('Organizing')
s2.add_skill('Marketing')
s2.add_skill('Digital Marketing')
print(s2.skills)

输出

MegaQi 住在 China 我的新技能树有 []
['JavaScript', 'React', 'Python']
Tom 住在 Finland 我的新技能树有 []
['Organizing', 'Marketing', 'Digital Marketing']

我们没有在子类中调用 init() 构造函数。虽然我们不调用它,但我们仍然可以从父类访问所有属性。但是如果我们调用构造函数,我们可以通过调用 super 来访问父属性。

我们可以给子类添加一个新方法,也可以通过在子类中创建相同的方法名来覆盖父类方法。比如当我们添加 init() 函数时,子类将不再继承父类的 init() 函数。

重写父方法

class Person:def __init__(self, name='Qi',country='China'):self.name = nameself.country = countryself.skills = []def person_info(self):return f'{self.name} 住在 {self.country} 我的新技能树有 {self.skills}'def add_skill(self, skill):self.skills.append(skill)class Student(Person):def __init__ (self, name='MegaQi', country='中国', gender="male"):self.gender = gendersuper().__init__(name, country)def person_info(self):gender = "他" if self.gender =='male' else '她'return f'{gender} 居住在 {self.country}。's1 = Student('ZhangSan', 'Finland','male')
print(s1.person_info())
s1.add_skill('JavaScript')
s1.add_skill('React')
s1.add_skill('Python')
print(s1.skills)s2 = Student('Lidiya', 'England', 'female')
print(s2.person_info())
s2.add_skill('Organizing')
s2.add_skill('Marketing')
s2.add_skill('Digital Marketing')
print(s2.skills)
他 居住在 Finland。
['JavaScript', 'React', 'Python']
她 居住在 England。
['Organizing', 'Marketing', 'Digital Marketing']

我们可以使用super()内置函数或父类名称Person自动从父类继承方法和属性。在上面的例子中,我们重写了父方法。子方法有一个不同的特点,它可以识别性别,根据输入的性别来决定使用哪个代词他或她。

🌕 现在,您已经完全拥有了编程的超级能力。现在来做些练习巩固下成果把。

💻 第21天练习

练习1级

  1. Python有一个名为 statistics 的模块,我们可以使用这个模块来进行统计计算。然而,为了学习如何制作函数和重用函数,让我们尝试开发一个程序,它可以计算样本的中趋势(均值,中位数,模态)和可变性(方差,标准偏差)的度量。除了这些测量之外,还要找到样本的最小值、最大值、计数、百分位数。您可以创建一个名为 Statistics 的类,并将所有执行统计计算函数创建为 Statistics 类的方法。

练习2级

  1. 创建一个名为 PersonAccount 的类,它有名字、收入、 花销属性,并且有类方法 total_income, total_expense, account_info, add_income, add_expense 和 account_balance。编写代码实现记账业务。

练习参考:21_exercise.py

🎉 CONGRATULATIONS ! 🎉

<< Day 20 | Day 22 >>

这篇关于挑战30天学完Python:Day21 类和对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/747849

相关文章

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

Linux升级或者切换python版本实现方式

《Linux升级或者切换python版本实现方式》本文介绍在Ubuntu/Debian系统升级Python至3.11或更高版本的方法,通过查看版本列表并选择新版本进行全局修改,需注意自动与手动模式的选... 目录升级系统python版本 (适用于全局修改)对于Ubuntu/Debian系统安装后,验证Pyt

Python实现开根号的五种方式

《Python实现开根号的五种方式》在日常数据处理、数学计算甚至算法题中,开根号是一个高频操作,但你知道吗?Python中实现开根号的方式远不止一种!本文总结了5种常用方法,感兴趣的小伙伴跟着小编一起... 目录一、为什么需要多种开根号方式?二、5种开根号方式详解方法1:数学库 math.sqrt() ——

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1: