Skip to main content

moregeek program

python基础(六) | 面向对象类定义及特性详解_wx62e40d60030b6的博客-多极客编程


⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实的基础。

🔥本文已收录于Python基础系列专栏: Python基础系列教程 欢迎订阅,持续更新。

Python基础(六) | 面向对象类定义及特性详解_初始化

引子

Python基础(六) | 面向对象类定义及特性详解_类的继承_02

Why:面向对象更符合人类对客观世界的抽象和理解

  • 一切皆对象
    一只小狗,一把椅子,一张信用卡,一条巧克力。。。
  • 一切对象,都有自己内在的属性
    狗狗的品种、椅子的质地、信用卡的额度、巧克力的口味。。。
  • 一切行为,皆是对象的行为
    狗狗蹲下、椅子移动位置、刷信用卡、巧克力融化了。。。

How:类是对象的载体

不同年龄、肤色、品质的猫,每一只都是一个对象

他们有一个共同的特征:都是猫

我们可以把一类对象的公共特征抽象出来,创建通用的类

# 创建类
class Cat():
"""模拟猫"""

def __init__(self, name):
"""初始化属性"""
self.name = name

def jump(self):
"""模拟猫跳跃"""
print(self.name + " is jumping")

# 用类创建实例
my_cat = Cat("Loser")
your_cat = Cat("Lucky")
# 调用属性
print(my_cat.name)
print(your_cat.name)
Loser
Lucky
# 调用方法
my_cat.jump()
your_cat.jump()
Loser is jumping
Lucky is jumping

6.1 类的定义

Python基础(六) | 面向对象类定义及特性详解_初始化_03

三要素:类名、属性、方法

6.1.1 类的命名

  • 要有实际意义
  • 驼峰命名法——组成的单词首字母大写
    Dog、 CreditCard、 ElectricCar

# class 类名:
"""类前空两行"""


class Car():
"""对该类的简单介绍"""
pass

"""类后空两行"""

6.1.2 类的属性

# def __init__(self,要传递的参数)  初始化类的属性
class Car():
"""模拟汽车"""

def __init__(self, brand, model, year):
"""初始化汽车属性""" # 相当于类内部的变量
self.brand = brand # 汽车的品牌
self.model = model # 汽车的型号
self.year = year # 汽车出厂年份
self.mileage = 0 # 新车总里程初始化为0

6.1.3 类的方法

# 相对于类内部定义的函数
class Car():
"""模拟汽车"""

def __init__(self, brand, model, year):
"""初始化汽车属性""" # 相当于类内部的变量
self.brand = brand # 汽车的品牌
self.model = model # 汽车的型号
self.year = year # 汽车出厂年份
self.mileage = 0 # 新车总里程初始化为0

def get_main_information(self): # self不能省
"""获取汽车主要信息"""
print("品牌:{} 型号:{} 出厂年份:{}".format(self.brand, self.model, self.year))

def get_mileage(self):
"""获取总里程"""
return "行车总里程:{}公里".format(self.mileage)

6.2 创建实例

Python基础(六) | 面向对象类定义及特性详解_父类_04

6.2.1 实例的创建

将实例赋值给对象,实例化过程中,传入相应的参数

v = 类名(必要的初始化参数)

my_new_car = Car("Audi", "A6", 2018)

6.2.2 访问属性

实例名.属性名

print(my_new_car.brand)
print(my_new_car.model)
print(my_new_car.year)
Audi
A6
2018

6.2.3 调用方法

class Car():
"""模拟汽车"""

def __init__(self, brand, model, year):
"""初始化汽车属性""" # 相当于类内部的变量
self.brand = brand # 汽车的品牌
self.model = model # 汽车的型号
self.year = year # 汽车出厂年份
self.mileage = 0 # 新车总里程初始化为0

def get_main_information(self): # self不能省
"""获取汽车主要信息"""
print("品牌:{} 型号:{} 出厂年份:{}".format(self.brand, self.model, self.year))

def get_mileage(self):
"""获取总里程数"""
return "行车总里程:{}公里".format(self.mileage)

实例名.方法名(必要的参数)

my_new_car = Car("Audi", "A6", 2018)
my_new_car.get_main_information()
品牌:Audi   型号:A6   出厂年份:2018
mileage = my_new_car.get_mileage()
print(mileage)
行车总里程:0公里

6.2.4 修改属性

1、直接修改

my_old_car = Car("BYD", "宋", 2016)

先访问,后修改

print(my_old_car.mileage)
my_old_car.mileage = 12000
print(my_old_car.mileage)
0
12000
print(my_old_car.get_mileage())
行车总里程:12000公里

2、通过方法修改属性

class Car():
"""模拟汽车"""

def __init__(self, brand, model, year):
"""初始化汽车属性""" # 相当于类内部的变量
self.brand = brand # 汽车的品牌
self.model = model # 汽车的型号
self.year = year # 汽车出厂年份
self.mileage = 0 # 新车总里程初始化为0

def get_main_information(self): # self不能省
"""获取汽车主要信息"""
print("品牌:{} 型号:{} 出厂年份:{}".format(self.brand, self.model, self.year))

def get_mileage(self):
"""获取总里程数"""
return "行车总里程:{}公里".format(self.mileage)

def set_mileage(self, distance):
"""设置总里程数"""
self.mileage = distance
my_old_car = Car("BYD", "宋", 2016)
print(my_old_car.get_mileage())
my_old_car.set_mileage(8000)
print(my_old_car.get_mileage())
行车总里程:0公里
行车总里程:8000公里

3、继续拓展

  • 禁止设置负里程
class Car():
"""模拟汽车"""

def __init__(self, brand, model, year):
"""初始化汽车属性""" # 相当于类内部的变量
self.brand = brand # 汽车的品牌
self.model = model # 汽车的型号
self.year = year # 汽车出厂年份
self.mileage = 0 # 新车总里程初始化为0

def get_main_information(self): # self不能省
"""获取汽车主要信息"""
print("品牌:{} 型号:{} 出厂年份:{}".format(self.brand, self.model, self.year))

def get_mileage(self):
"""获取总里程数"""
print("行车总里程:{}公里".format(self.mileage))

def set_mileage(self, distance):
"""设置总里程数"""
if distance >= 0:
self.mileage = distance
else:
print("里程数不能为负!")

def increment_mileage(self, distance):
"""总里程数累计"""
if distance >= 0:
self.mileage += distance
else:
print("新增里程数不能为负!")

my_old_car = Car("BYD", "宋", 2016)
my_old_car.get_mileage()
my_old_car.set_mileage(-8000)
my_old_car.get_mileage()
行车总里程:0公里
里程数不能为负!
行车总里程:0公里
  • 将每次的里程数累加

my_old_car.get_mileage()
my_old_car.set_mileage(8000)
my_old_car.get_mileage()
my_old_car.increment_mileage(500)
my_old_car.get_mileage()
行车总里程:0公里
行车总里程:8000公里
行车总里程:8500公里

小结

my_new_car = Car("Audi", "A6", 2018)
my_cars = [my_new_car, my_old_car]
  • 包含的信息量可以是极大的,可以创建无穷多的实例
  • 高度的拟人(物)化,符合人类对客观世界的抽象和理解

6.3 类的继承

Python基础(六) | 面向对象类定义及特性详解_初始化_05

引子

看一下人在生物界的分支链

生物——动物界——脊索动物门——哺乳动物纲——灵长目——人科——人属——智人种

公共特征逐渐增加的过程

【问题】

假设二元系统: 人属 = {A人种, B人种, C人种。。。。}

为每一个人种构造一个类

方案一:
各自独立,分别构造各自人种的类

方案二:

1、将各人种公共特征提取出来,建立人属的类;

2、各人种继承上一级(人属)的公共特征,然后添加自身特殊特征,构建各自人种的类。

通常,我们选择方案二,因为他避免了过多的重复劳动

所谓继承,就是低层抽象继承高层抽象的过程

6.3.1 简单的继承

父类

class Car():
"""模拟汽车"""

def __init__(self, brand, model, year):
"""初始化汽车属性""" # 相当于类内部的变量
self.brand = brand # 汽车的品牌
self.model = model # 汽车的型号
self.year = year # 汽车出厂年份
self.mileage = 0 # 新车总里程初始化为0


def get_main_information(self): # self不能省
"""获取汽车主要信息"""
print("品牌:{} 型号:{} 出厂年份:{}".format(self.brand, self.model, self.year))

def get_mileage(self):
"""获取总里程数"""
print("行车总里程:{}公里".format(self.mileage))

def set_mileage(self, distance):
"""设置总里程数"""
if distance >= 0:
self.mileage = distance
else:
print("里程数不能为负!")

def increment_mileage(self, distance):
"""总里程数累计"""
if distance >= 0:
self.mileage += distance
else:
print("新增里程数不能为负!")

子类

class 子类名(父类名):

  • 新建一个电动汽车的类

class ElectricCar(Car):
"""模拟电动汽车"""

def __init__(self, brand, model, year):
"""初始化电动汽车属性"""
super().__init__(brand, model, year) # 声明继承父类的属性,这里的super就是超类(父类)
  • 自动继承父类的所有方法

my_electric_car = ElectricCar("NextWeek", "FF91", 2046)
my_electric_car.get_main_information()
品牌:NextWeek   型号:FF91   出厂年份:2046

6.3.2 给子类添加属性和方法

class ElectricCar(Car):
"""模拟电动汽车"""

def __init__(self, brand, model, year, bettery_size):# 新传入的参数bettery_size
"""初始化电动汽车属性"""
super().__init__(brand, model, year) # 声明继承父类的属性
self.bettery_size = bettery_size # 电池容量
self.electric_quantity = bettery_size # 电池剩余电量
self.electric2distance_ratio = 5 # 电量距离换算系数 5公里/kW.h
self.remainder_range = self.electric_quantity*self.electric2distance_ratio # 剩余可行驶里程

def get_electric_quantit(self):
"""查看当前电池电量"""
print("当前电池剩余电量:{} kW.h".format(self.electric_quantity))

def set_electric_quantity(self, electric_quantity):
"""设置电池剩余电量,重新计算电量可支撑行驶里程"""
if electric_quantity >= 0 and electric_quantity <= self.bettery_size:
self.electric_quantity = electric_quantity
self.remainder_range = self.electric_quantity*self.electric2distance_ratio
else:
print("电量未设置在合理范围!")

def get_remainder_range(self):
"""查看剩余可行驶里程"""
print("当前电量还可以继续驾驶 {} 公里".format(self.remainder_range))

my_electric_car = ElectricCar("NextWeek", "FF91", 2046, 70)
my_electric_car.get_electric_quantit() # 获取当前电池电量
my_electric_car.get_remainder_range() # 获取当前剩余可行驶里程
当前电池剩余电量:70 kW.h
当前电量还可以继续驾驶 350 公里
my_electric_car.set_electric_quantity(50)         # 重设电池电量
my_electric_car.get_electric_quantit() # 获取当前电池电量
my_electric_car.get_remainder_range() # 获取当前剩余可行驶里程
当前电池剩余电量:50 kW.h
当前电量还可以继续驾驶 250 公里

6.3.3 重写父类的方法——多态

首先在子类的方法中找,如果找不到再去父类的方法中寻找

class ElectricCar(Car):
"""模拟电动汽车"""

def __init__(self, brand, model, year, bettery_size):
"""初始化电动汽车属性"""
super().__init__(brand, model, year) # 声明继承父类的属性
self.bettery_size = bettery_size # 电池容量
self.electric_quantity = bettery_size # 电池剩余电量
self.electric2distance_ratio = 5 # 电量距离换算系数 5公里/kW.h
self.remainder_range = self.electric_quantity*self.electric2distance_ratio # 剩余可行驶里程

def get_main_information(self): # 重写父类方法
"""获取汽车主要信息"""
print("品牌:{} 型号:{} 出厂年份:{} 续航里程:{} 公里"
.format(self.brand, self.model, self.year, self.bettery_size*self.electric2distance_ratio))

def get_electric_quantit(self):
"""查看当前电池电量,重新计算电量可支撑行驶里程"""
print("当前电池剩余电量:{} kW.h".format(self.electric_quantity))

def set_electric_quantity(self, electric_quantity):
"""设置电池剩余电量"""
if electric_quantity >= 0 and electric_quantity <= self.bettery_size:
self.electric_quantity = electric_quantity
self.remainder_range = self.electric_quantity*self.electric2distance_ratio
else:
print("电量未设置在合理范围!")

def get_remainder_range(self):
"""查看剩余可行驶里程"""
print("当前电量还可以继续驾驶 {} 公里".format(self.remainder_range))
my_electric_car = ElectricCar("NextWeek", "FF91", 2046, 70)
my_electric_car.get_main_information()
品牌:NextWeek   型号:FF91   出厂年份:2046   续航里程:350 公里

6.3.4 用在类中的实例

把电池抽象成一个对象

逻辑更加清晰

class Bettery():
"""模拟电动汽车的电池"""

def __init__(self, bettery_size = 70):
self.bettery_size = bettery_size # 电池容量
self.electric_quantity = bettery_size # 电池剩余电量
self.electric2distance_ratio = 5 # 电量距离换算系数 5公里/kW.h
self.remainder_range = self.electric_quantity*self.electric2distance_ratio # 剩余可行驶里程

def get_electric_quantit(self):
"""查看当前电池电量"""
print("当前电池剩余电量:{} kW.h".format(self.electric_quantity))

def set_electric_quantity(self, electric_quantity):
"""设置电池剩余电量,计重新算电量可支撑行驶里程"""
if electric_quantity >= 0 and electric_quantity <= self.bettery_size:
self.electric_quantity = electric_quantity
self.remainder_range = self.electric_quantity*self.electric2distance_ratio
else:
print("电量未设置在合理范围!")

def get_remainder_range(self):
"""查看剩余可行驶里程"""
print("当前电量还可以继续驾驶 {} 公里".format(self.remainder_range))
class ElectricCar(Car):
"""模拟电动汽车"""

def __init__(self, brand, model, year, bettery_size):
"""初始化电动汽车属性"""
super().__init__(brand, model, year) # 声明继承父类的属性
self.bettery = Bettery(bettery_size) # 电池

def get_main_information(self): # 重写父类方法
"""获取汽车主要信息"""
print("品牌:{} 型号:{} 出厂年份:{} 续航里程:{} 公里"
.format(self.brand, self.model, self.year,
self.bettery.bettery_size*self.bettery.electric2distance_ratio))
my_electric_car = ElectricCar("NextWeek", "FF91", 2046, 70)
my_electric_car.get_main_information() # 获取车辆主要信息
品牌:NextWeek   型号:FF91   出厂年份:2046   续航里程:350 公里
my_electric_car.bettery.get_electric_quantit()          # 获取当前电池电量
当前电池剩余电量:70 kW.h
my_electric_car.bettery.set_electric_quantity(50)       # 重设电池电量
my_electric_car.bettery.get_electric_quantit()          # 获取当前电池电量
当前电池剩余电量:50 kW.h
my_electric_car.bettery.get_remainder_range()           # 获取当前剩余可行驶里程
当前电量还可以继续驾驶 250 公里

python 内置数据类型与方法_ni_cue~的博客-多极客编程

序列类型包括列表、元组和范围(range)以及字符串,序列类型的对象有一些共同的操作,如操作符运算、切片操作等。 1. list类型与操作 1.1 玩转索引 列表(list)类型的对象可以通过 list()函数来创建。如果list()函数没有传入参数,则创建一个空列表。 In [1]:L1=1izt([123, 23, [4,5,6], 'abe')) In [2]:L1 0ut[[2]:[123

[python]分享七条有用的pip命令_ai算法之道的博客-多极客编程

1. 引言众所周知,在Python的日常学习中,我们最最经常使用的一个包就是​​pip​​,它的全称叫做​​package installer for python​​ ,直译过来就是Python包管理器,核心功能就是对Python的第三方库进行安装、更新、卸载等操作。2. 基础用法举例,在某些数学科学项目中,我们经常需要使用到例如​​pandas ​​第三方包来进行相关数据处理,此时我们一般通过

python 时间与日期模块总结_ni_cue~的博客-多极客编程

python标准库中关于日期和时间的库主要有三个:calendar、time和datetime。 1.calemdar模块 calendar模块在日历的获取、显示以及年份是否为闰年等方面有诸多函数支持 1.1打印日历 import calendar # 输出2022年9月份的日历 print(calendar.month(2022, 9)) 输出结果 September 2022

【numpy总结】第二节:numpy 的属性与形状变换_wx63313ff276aef的博客-多极客编程

一、最基本的属性 在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions),维度的数量称为秩(rank);比如说,二维数组相当于是两个一维数组,即 二维数组有两个轴,秩为2 。 <font color=blue > 重点:很多时候可以声明 axis。 axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作; axis=1,表示沿着第 1 轴进

[oeasy]教您玩转python - 0002 - 你好世界(hello world!)_overmind1980的博客-多极客编程

你好世界 🥊 回忆上次内容 这次我们, 了解了 Python 进入了 Python 退出了 Python 这并不难 这就是我们对于 Python 的初体验 恭喜您存活了下来! python 还有什么好玩的呢?🤔 你好世界 #首先进入Python3 python3 我们想要来个Hello World! 然后直接输入 #貌似程序都是从hello world开始的 Hello

30天python入门到进阶——第7天:函数_freestu的博客-多极客编程

接着上一期的继续,我们已经讲完了所有的流程控制,这一期,我们将详细了解Python中的函数和方法、文档字符串、以及作用域的实践。我会尽我所能用清晰简单的语言解释。函数函数是一个非常重要的概念,它们存在于所有编程语言中。函数允许我们定义一个动作(代码块),然后执行该动作任意次数,而无需遵循DRY原则重复自己。到目前为止,我一直在使用Python提供的一些内置函数,例如​​print​​​​input

vb.net的整型数据类型_vb.net课程的博客-多极客编程

        VB.NET语言里的整形数据类型包括:SByte、Byte、Short、UShort、Integer、UInteger、Long、ULong。SByte和Byte为字节整数,Short和UShort为双字节整数,Integer和UInteger为四字节整数,Long和ULong为八字节整数(它们的具体数值范围见《​​VB.NET的数据类型​​》)。其中最有效率的存储单位为Integ

java基础(二)| 基础语法之运算输入与控制语句_wx62e40d60030b6的博客-多极客编程

⭐本专栏旨在对JAVA的基础语法及知识点进行全面且详细的讲解,完成从0到1的java学习,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握JAVA编程,同时为后续的框架学习,进阶开发的代码能力打下坚实的基础。🔥本文已收录于JAVA基础系列专栏: Java基础教程 免费订阅,持续更新。1. 运算符1.1 算术运算符1.1.1 运算符和表达式运算符:对常量或者变量进行操作的符号表达式:用运算符

recyclerview实践demo,支持item点击事件_12338090的博客-多极客编程

recyclerview实践demo,支持item点击事件 背景 项目中之前使用recyclerview较多,简单总结一下,持续优化。 基本使用 话不多说,直接上代码。 1、xml布局文件中个使用recyclerview。 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.Constr

vb.net的整型数据类型_vb.net课程的博客-多极客编程

        VB.NET语言里的整形数据类型包括:SByte、Byte、Short、UShort、Integer、UInteger、Long、ULong。SByte和Byte为字节整数,Short和UShort为双字节整数,Integer和UInteger为四字节整数,Long和ULong为八字节整数(它们的具体数值范围见《​​VB.NET的数据类型​​》)。其中最有效率的存储单位为Integ

数值计算(1) --求解连续微分系统和混沌系统_domi+1的博客-多极客编程

前言微分系统在工程项目中很常见,通过物理建模之后,基本都需要求解微分方程得到其结果,混沌系统属于特殊的一类微分系统,在某些项目上也很常见,同时可以引申出分岔图、李雅普诺夫指数谱、相图、庞加莱截面等,本文探讨通过matlab常见的微分求解函数和simulink求解器来实现计算。关键字:微分系统,混沌系统,Simulink正文1、常微分方程(Lorenze混沌系统)方法1:m文件实现x0=[0;0;1

matlab绘制特殊的图形_domi+1的博客-多极客编程

1、指定坐标轴刻度值和标签自定义沿坐标轴的刻度值和标签有助于突出显示数据的特定方面。以下示例说明一些常见的自定义,例如修改刻度值的放置位置、更改刻度标签的文本和格式,以及旋转刻度标签。1.1、更改刻度值位置和标签创建 x,将其指定为200个介于-10 和10之间的线性间隔值,创建x的余弦函数 y,绘制数据图。x = linspace(-10,10,200);y = cos(x);plot(x,y)