【python基础】类的继承、类导入、类的编写规范

文章目录

  • 一. 继承
    • 1. 子类的方法__init__()
    • 2. 子类特有的属性和方法
    • 3. 重写父类的方法
    • 4. 类关系之引入:将实例用作属性
  • 二. 导入类
    • 1. 导入类
    • 2. 在一个模块中导入另一个模块
    • 3. 使用别名导入并创建实例
  • 三. Python标准库
  • 四. 类编码风格

一. 继承

  1. 一个类继承另一个类时,将自动获得另一个类的所有属性和方法。
  2. 子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。
  3. 子类可以覆写父类的方法。

1. 子类的方法__init__()

创建子类时,要调用父类的方法__init__()。这将初始化在父类__init__()方法中定义的所有属性,从而让子类包含这些属性

使用 super().__init__()来调用父类方法。

 
如下:

class Car:"""一次模拟汽车的简单尝试。"""def __init__(self, make, model, year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):long_name = f"{self.year} {self.make} {self.model}"return long_name.title()class ElectricCar(Car):"""电动汽车的独特之处。"""def __init__(self, make, model, year):"""初始化父类的属性。"""super().__init__(make, model, year)if __name__ == '__main__':my_tesla = ElectricCar('tesla', 'model s', 2019)print(my_tesla.get_descriptive_name())
  1. 创建子类时,父类必须包含在当前文件中,且位于子类前面
  2. 子类名称后的括号指定父类名称来继承

 

2. 子类特有的属性和方法

如下新增电池属性

class ElectricCar(Car):def __init__(self, make, model, year):super().__init__(make, model, year)# 新增电池属性,并设置其初始值(75)self.battery_size = 75def describe_battery(self):"""打印一条描述电瓶容量的消息。"""print(f"This car has a {self.battery_size}-kWh battery.")if __name__ == '__main__':my_tesla = ElectricCar('tesla', 'model s', 2019)print(my_tesla.get_descriptive_name())my_tesla.describe_battery()

 

3. 重写父类的方法

对于父类的方法,只要它不符合子类模拟的实物的行为,都可以进行重写。为此,可在子类中定义一个与要重写的父类方法同名的方法。

假设Car类有一个名为fill_gas_tank()的方法,它对全电动汽车来说毫无意义,因此你可能想重写它。下面演示了一种重写方式:

    def fill_gas_tank(self):"""电动汽车没有油箱。"""print("This car doesn't need a gas tank!")

使用继承时,可让子类保留从父类那里继承而来的精华,并剔除不需要的糟粕。

 

4. 类关系之引入:将实例用作属性

使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分提取出来,作为一个独立的类。可以将大型类拆分成多个协同工作的小类。

# 将有关电池相关的属性提出来,作为单独的类
class Battery:"""一次模拟电动汽车电瓶的简单尝试。"""def __init__(self, battery_size=75):"""初始化电瓶的属性。"""self.battery_size = battery_sizedef describe_battery(self):"""打印一条描述电瓶容量的消息。"""print(f"This car has a {self.battery_size}-kWh battery.")class ElectricCar(Car):def __init__(self, make, model, year):super().__init__(make, model, year)self.battery_size = 75self.battery = Battery()def describe_battery(self):"""打印一条描述电瓶容量的消息。"""print(f"This car has a {self.battery_size}-kWh battery.")def fill_gas_tank(self):"""电动汽车没有油箱。"""print("This car doesn't need a gas tank!")if __name__ == '__main__':my_tesla = ElectricCar('tesla', 'model s', 2019)print(my_tesla.get_descriptive_name())my_tesla.battery.describe_battery()

 
给Battery新增了方法get_range()做了一些简单的分析。

class Battery:
...def get_range(self):"""打印一条消息,指出电瓶的续航里程。"""if self.battery_size == 75:range = 260elif self.battery_size == 100:range = 315print(f"This car can go about {range} miles on a full charge.")if __name__ == '__main__':my_tesla = ElectricCar('tesla', 'model s', 2019)my_tesla.battery.get_range()

 

二. 导入类

为遵循Python的总体理念,应让文件尽可能整洁。Python在这方面提供了帮助,允许将类存储在模块中,然后在主程序中导入所需的模块。

1. 导入类

设有一个car.py的类文件,存放了多个类

"""一组用于表示燃油汽车和电动汽车的类。"""class Car:--snip--class Battery:"""一次模拟电动汽车电瓶的简单尝试。"""def __init__(self, battery_size=75):"""初始化电瓶的属性。"""self.battery_size = battery_sizedef describe_battery(self):"""打印一条描述电瓶容量的消息。"""print(f"This car has a {self.battery_size}-kWh battery.")def get_range(self):"""打印一条描述电瓶续航里程的消息。"""if self.battery_size == 75:range = 260elif self.battery_size == 100:range = 315print(f"This car can go about {range} miles on a full charge.")class ElectricCar(Car):"""模拟电动汽车的独特之处。"""def __init__(self, make, model, year):"""初始化父类的属性。再初始化电动汽车特有的属性。"""super().__init__(make, model, year)self.battery = Battery()

下面来创建另一个文件my_car.py,在其中导入Car类并创建其实例

导入多个类

from car import Car, ElectricCarif __name__ == '__main__':my_beetle = Car('volkswagen', 'beetle', 2019)print(my_beetle.get_descriptive_name())my_tesla = ElectricCar('tesla', 'roadster', 2019)print(my_tesla.get_descriptive_name())

 

导入整个模块,再使用句点表示法访问需要的类。

import car if __name__ == '__main__':my_beetle = car.Car('volkswagen', 'beetle', 2019)print(my_beetle.get_descriptive_name())my_tesla = car.ElectricCar('tesla', 'roadster', 2019)print(my_tesla.get_descriptive_name())

使用语法module_name.ClassName访问需要的类。

 
导入模块中的所有类(不推荐)

from module_name import *

不推荐使用这种导入方式,原因有二。

  1. 如果只看文件开头的import语句,就能清楚地知道程序使用了哪些类,将大有裨益。然而这种导入方式没有明确地指出使用了模块中的哪些类。
  2. 这种方式还可能引发名称方面的迷惑。如果不小心导入了一个与程序文件中其他东西同名的类,将引发难以诊断的错误。

 

2. 在一个模块中导入另一个模块

有时候,需要将类分散到多个模块中,以免模块太大或在同一个模块中存储不相关的类。将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类

car类、Battery和ElectricCar放到不同的模块中

car.py

class Car:
。。。

elec_car.py

from car import Carclass Battery:"""一次模拟电动汽车电瓶的简单尝试。"""。。。class ElectricCar(Car):
。。

这里只引入ElectricCar即可,因为elec_car模块中已经导入了Car。这叫做依赖传递。

from elec_car import ElectricCarif __name__ == '__main__':my_tesla = ElectricCar('tesla', 'model s', 2019)print(my_tesla.get_descriptive_name())

但和java不同的是:

在同一目录下的类,java不需要导入可以直接引用,py始终需要导入你所需要的类

 

3. 使用别名导入并创建实例

导入类时,也可为其指定别名。

例如,要在程序中创建大量电动汽车实例,需要反复输入ElectricCar,非常烦琐。为避免这种烦恼,可在import语句中给ElectricCar指定一个别名:

from electric_car import ElectricCar as EC# 现在就可以使用别名创建实例了
my_tesla = EC('tesla', 'roadster', 2019)

 

三. Python标准库

Python标准库是一组模块,我们安装的Python都包含它。你可以使用标准库中的任何函数和类,只需在程序开头包含一条简单的import语句即可。

如下random模块:

from random import randintif __name__ == '__main__':#一到六随机返回一个数print(randint(1,6))# 将一个列表或元组作为参数,并随机返回其中的一个元素:
from random import randint, choiceif __name__ == '__main__':players = ['charles', 'martina', 'michael', 'florence', 'eli']print(choice(players))

注意: 还可以从其他地方下载外部模块,类似与java的依赖

 

四. 类编码风格

  1. 类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。
  2. 实例名和模块名都采用小写格式,并在单词之间加下划线。
  3. 对于每个类,都应紧跟在类定义后面包含一个文档字符串。
  4. 每个模块也都应包含一个文档字符串,对其中的类可用于做什么进行描述。
  5. 可使用空行来组织代码,但不要滥用。
    • 在类中,可使用一个空行来分隔方法;
    • 在模块中,可使用两个空行来分隔类。
  6. 需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句。

 

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

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

相关文章

log4j2启动异步日志与动态修改日志级别

启动异步日志 启用 Log4j2 的异步日志记录功能可以显著提升日志记录的性能,尤其是在高并发的环境下。异步日志记录通过将日志事件放入队列中进行处理,从而减少了日志记录对应用程序性能的影响。以下是如何启用 Log4j2 异步日志记录的详细步骤。 1. 添加…

【Python】写一篇setattr方法的使用博客

为何每次早餐 仍然魂离魄散 原来 那朝分手都要啜泣中上班 明明能够过得这关 赢回旁人盛赞 原来 顽强自爱这样难 难得的激情总枉费 残忍的好人都美丽 别怕 你将无人会代替 🎵 陈慧娴《情意结》 在 Python 中,动态地操作对象的属性是…

Oracle(15)什么是索引(Index)?

索引(Index)是数据库中一种用于提高查询性能的数据结构。索引在数据库表的一个或多个列上创建,类似于书的目录,通过索引可以快速定位和检索表中的数据行,而无需扫描整个表。尽管索引可以大幅提升查询性能,但…

2024 年 100 大数据科学面试问答

2024 年 100 大数据科学面试问答 一、说明 数据科学是一个快速发展的领域,它正在改变组织根据数据理解和做出决策的方式。因此,公司越来越多地寻求聘请数据科学家来帮助他们理解数据并推动业务成果。这导致了对数据科学家的高需求,这些职位的…

LeetCode 热题 HOT 100 (004/100)【宇宙最简单版】

【单调栈】No. 0739 每日温度 【中等】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 ⭐ 题目描述:给定一个整数数组 temperatu…

《Windows API每日一练》13.1 打印基础

在Windows中使用打印机时,在调用一系列与打印相关的GDI绘图函数的背后,实际上启动了一系列模块之间复杂的交互过程,包括 GDI32库模块、打印机设备驱动程序库模块(带.DRV后缀的文件)、Windows后台打印处理程序&#xff…

rem 和 px 的关系

在网页设计中,rem 和 px 是用来表示长度或尺寸的单位,它们之间有以下默认关系: 1rem 16px(假设根元素的字体大小为默认值) 详细说明: 1、px(像素): px 是一种绝对单…

【图像处理】不智能的目标识别

目录 目标识别的划分 识别入门 概念学习 滤波 模版 阈值化 形态学操作 开运算 闭运算 编程语言 示例 大家有没有想过在没有人工智能或者说没有机器学习的的时候,计算机是怎么做目标识别的? 计算机视觉时至今日也是急需人才的领域&…

(AAAI,2024)Structure-CLIP:利用场景知识图谱增强多模态结构化表征

文章目录 Structure-CLIP: Towards Scene Graph Knowledge to Enhance Multi-modal Structured Representations相关资料摘要引言方法通过场景图进行语义负采样场景图生成选择语义负样本对比学习目标知识增强编码器 Structure-CLIP: Towards Scene Graph Knowledge to Enhance …

go语言Gin框架的学习路线(七)

GORM入门(基于七米老师) 目录 GORM入门 安装 连接数据库 连接MySQL 连接PostgreSQL 连接Sqlite3 连接SQL Server 我们搞一个连接MySQL的例子 创建数据库 GORM操作MySQL GORM是一个流行的Go语言ORM(对象关系映射)库,它提供了一种方…

maven私服上传jar包 400 Bad Request 错误

文章目录 前言一、直接看报错二、问题处理三 maven 私服配置说明总结 前言 maven仓库的私服,一般会存放公司或者个人封装的jar包,用来共享给二次开发和协作伙伴用,很方便 第一次发布没有问题,但是我第二次发布,开始报错了 一、直接看报错 [外链图片转存失败,源站可能有防盗链…

数据库使用笔记-基于mysql

来自🥬🐶程序员 Truraly | 田园 的博客,最新文章首发于:田园幻想乡 | 原文链接 | github (欢迎关注) 文章目录 MySql 一般信息观前提示登录 MySQLSQL 语句 数据库操作指令show databases | 现实数据库列表u…

问题解决实录 | Anaconda | Anaconda Navigator 启动无反应

问题解决实录 | Anaconda | Anaconda Navigator 启动无反应 以管理员身份运行 Anaconda Prompt conda update -n root conda conda update --all如果执行完以上步骤 碰到 AttributeError: module ‘pkgutil’ has no attribute ‘ImpImporter’. Did you mean: ‘zipimporter…

HC-SR04超声波测距模块使用方法和例程(STM32快速移植)

基于STM32和HC-SR04模块实现超声波测距功能 HC-SR04硬件概述HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器,将电信号转换为40 KHz超声波脉冲。接收器监听发射的脉冲。如果接收到它们,它将产生一个输出脉冲,其宽度可用于…

各类专业技术的pdf电子书

从业多年,收集了海量的pdf电子书籍,感兴趣的私聊。

App Instance 架构示例

前言 在Unity程序设计过程中,我们处理的第一个对象是Application Instance。 它的主要职责是启动流程管理、卸载流程管理,次要职责是管理在内部的子系统生命周期。其他职责,提供或桥接应用程序的配置信息、及其他第三方接口。 它通常以单例的…

图解 Hadoop 架构 |Yarn、MapReduce

Hadoop Hadoop 是什么 Hadoop 是由 Apache 基金会所开发,维护的分布式系统基础架构主要解决海量数据的存储和海量数据的分析计算问题广义上来说,Hadoop 通常是指一个更广泛的概念——Hadoop 生态圈,包括 MapReduce,HDFS&#xf…

淼淼瀛湖水,青青枇杷林

淼淼瀛湖水,青青枇杷林 ——西安工程大学赴陕西安康“筑梦乡村,携手同行”暑期社会实践团 俗语言“五月枇杷满树金”。枇杷营养丰富,食用,具有止渴、润燥、清肺、止咳等功效。为探索枇杷产业,实现乡村振兴&#xff0c…

代码随想录 day 18 二叉树

第六章 二叉树part06 详细布置 530.二叉搜索树的最小绝对差 需要领悟一下二叉树遍历上双指针操作,优先掌握递归 题目链接/文章讲解:https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%B…

MacOSM1 配置Miniconda环境,并设置自启动

文章目录 设置环境变量设置自启动参考 设置环境变量 cd vim .zshrc输入一下内容 # 配置Conda CONDA_HOME/Users/hanliqiang/miniconda3 PATH$CONDA_HOME/bin:$PATH生效配置 source .zshrc设置自启动 conda init zsh.zshrc 文件中将会出现以下内容 # >>> conda i…