30 - 面向对象的其他语法

news2024/10/2 12:18:52

目录

一、本章重点

二、对象的分类

1、类对象

(1)理解

(2)作用

2、实例对象

(1)理解

三、属性的划分

1、实例属性

(1)概念

(2)定义

(3)特征(内存)

(4)访问和修改

2、类属性

(1)概念

(2)定义

(3)特征(内存)

(4)访问和修改

3、什么时候 定义类属性?

4、类属性案例

(1)需求

(2)示例代码

四、方法的划分

1、实例方法

(1)定义时机

(2)定义

(3)参数

(4)调用

2、类方法

(1)定义时机

(2)定义

(3)参数

(4)调用

3、类方法案例

(1)需求

(2)示例代码

4、静态方法(了解)

(1)定义时机

(2)定义

(3)参数

(4)调用

5、方法综合案例

(1)需求

(2)示例代码

五、类属性和类方法的应用场景

六、私有属性和私有方法

1、公有权限

(1)定义

(2)特点

2、私有权限

(1)定义

(2)特点

(3)应用场景

(4)调用方式

(5)私有属性和私有方法实例代码


一、本章重点

  • 类属性和类方法
  • 私有属性和私有方法
  • 静态方法

二、对象的分类

Python中的一切皆对象

1、类对象

(1)理解

  • 类对象 就是 类,就是使用class定义的类
  • 程序运行时,类会被加载到内存中

(2)作用

  • 使用类对象创建实例对象:实例对象 = 类方法名()
  • 存储一些类的特征值(类属性)

2、实例对象

(1)理解

  • 创建对象也称为实例化,所以由 类对象(类) 创建的对象,称为实例对象,简称实例
  • 一般来说,没有特殊强调所说的对象,都是实例对象(实例)
  • 实例对象 可以保存实例的特征值(实例属性)

三、属性的划分

  • 使用“实例对象.属性”访问属性的时候,会先在 实例属性中查找,找到就使用,找不到就去类属性中查找,还找不到就报错。
  • 即:每个实例对象,都有可能访问类属性值(前提:实例属性和类属性不重名)

1、实例属性

(1)概念

  • 实例属性是每个实例对象,具有的特征(属性),每个实例对象的特征

(2)定义

  • 一般都是在init方法中,使用“self.属性名=属性值”来定义

(3)特征(内存)

  • 每个实例对象,都会保存自己的实例属性,即内存中存在多分

(4)访问和修改

  • 可以认为是通过self
    • 实例对象.属性 = 属性值   #修改
    • 实例对象.属性                  #访问

2、类属性

(1)概念

  • 类属性是类对象具有的特征,是整个类的特征

(2)定义

  • 一般在类的内部(class缩进中),方法的外部(def的缩进外部)定义变量

(3)特征(内存)

  • 只有类对象保存一份,即在内存中只有一个

(4)访问和修改

  • 即通过类名
    • 类对象.属性 = 属性值   #修改
    • 类对象.属性                 #访问

3、什么时候 定义类属性?

  • 代码中使用的属性,基本上都是实例属性,即通过“self.属性名=属性值”定义
  • 当某个属性值描述的信息,是整个类的特征(这个值变动,所有的这个类的实例对象的这个特征都会发生变化)

4、类属性案例

(1)需求

  • 定义一个工具类
  • 每件工具都有自己的name
  • 需求---知道使用这个类,创建了多少个工具对象?

(2)示例代码

class Tool(object):
    # 定义类属性count,记录创建工具对象的总数
    count = 0

    def __init__(self,name):
        self.name = name   #实例属性,工具的名字
        # 修改类属性的值
        Tool.count +=1

if __name__ == '__main__':
    # 创建工具对象
    tool1 = Tool("斧头")
    tool2 = Tool("榔头")
    tool3 = Tool("铁锹")

    # 查看使用Tool类到底创建了多少个对象?
    print(f"现在创建了{Tool.count}个工具")   #类对象.类属性名:查看类属性
    print(tool2.count)   #先找实例属性count,找不到,找类属性count,找到了,使用
'''
运行结果:
    现在创建了3个工具
    3
'''

四、方法的划分

1、实例方法

(1)定义时机

  • 如果方法中 需要使用 实例属性,则这个方法“必须”定义为实例方法

(2)定义

  • 在类中直接定义的方法,就是实例方法

(3)参数

  • 参数一般写作 self,表示的是实例对象
  • 有疑惑请参考: 24 - 面向对象1_是李黏黏鸭的博客-CSDN博客的九.1

(4)调用

  • 实例对象.方法名()

2、类方法

(1)定义时机

  • 如果方法中 不需要使用 实例属性,但需要使用类属性,则这个方法“可以”定义为 类方法(建议)

(2)定义

  • 定义类方法,需要在方法名上方书写@classmethod,即使用@classmethod装饰器修饰

(3)参数

  • 参数一般写作 cls,表示类对象,即 类名,不需要手动传递,Python解释器会自动传递

(4)调用

  • 方法一:
    • 类名.方法名
  • 方法二:
    • 实例对象.方法名()
  • 在类方法内部
    • 可以通过“cls.属性名”访问类的属性
    • 也可以通过“cls.方法名()”调用其他的类方法

3、类方法案例

(1)需求

  • 定义一个工具类
  • 每件工具都有自己的name
  • 需求---知道使用这个类,创建了多少个工具对象?

(2)示例代码

class Tool(object):
    # 定义类属性,记录创建工具对象的总数
    count = 0

    def __init__(self,name):
        self.name = name   #实例属性,工具的名字
        # 修改类属性的值
        Tool.count +=1

    @classmethod
    def show_tool_count(cls):   #cls:就是类对象,类名
        '''显示工具对象总数'''
        print(f'工具对象的总数={cls.count}')

# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("铁锹")

# 调用类方法
Tool.show_tool_count()
tool2.show_tool_count()

'''
运行结果:
    工具对象的总数=3
    工具对象的总数=3
'''

4、静态方法(了解)

(1)定义时机

  • 方法中既 不需要 访问 实例属性 或者调用 实例方法,也 不需要 访问 类属性 或者调用 类方法,“可以”将这个方法定义为 静态方法
  • 静态方法可以和函数一样传入参数使用

(2)定义

  • 定义静态方法,需要使用装饰器 @staticmethod,装饰方法

(3)参数

  • 静态方法,对参数一般没有要求

(4)调用

  • 方法一:类名.方法名()
  • 方法二:实例对象.方法名()

5、方法综合案例

(1)需求

  • 设计一个Game类
  • 属性
    • 定义一个top_score类属性 -> 记录游戏的历史最高分
    • 定义一个player_name实例属性 -> 记录当前游戏的玩家姓名
  • 方法
    • 静态方法show_help() -> 显示游戏帮助信息
    • 类方法show_top_score() -> 显示历史最高分
    • 实例方法start_game() -> 开始当前玩家的游戏
  • 主程序步骤
    • 查看帮助信息
    • 查看历史最高分
    • 创建游戏对象,开始游戏

(2)示例代码

# 定义一个Game类
class Game:
    # 定义类属性top_score,用于记录历史最高分
    top_score = 0

    def __init__(self, player_name):
        # 定义一个示例属性player_name,用于记录玩家姓名
        self.player_name = player_name

    # 静态方法show_help() -> 显示游戏帮助信息
    @staticmethod
    def show_help():
        print(f'游戏帮助信息')

    # 类方法show_top_score() -> 显示历史最高分
    @classmethod
    def show_top_score(cls):
        print(f'历史最高分{Game.top_score}')
        # print(f'历史最高分是{cls.top_score}')

    # 实例方法start_game() -> 开始当前玩家的游戏
    def start_game(self):
        print(f'开始当前玩家{self.player_name}的游戏')


if __name__ == '__main__':
    # 1、查看帮助信息
    Game.show_help()
    # 2、查看历史最高分
    Game.show_top_score()
    # 3、创建游戏对象
    palyer1 = Game('黏黏')
    # 4、开始游戏
    palyer1.start_game()
    # 使用'类对象.属性名 = 属性值'类属性历史最高分
    Game.top_score = 99
    # 5、游戏结束,查看历史最高分
    palyer1.show_top_score()
'''
运行结果:
    游戏帮助信息
    历史最高分0
    开始当前玩家黏黏的游戏
    历史最高分99
'''

五、类属性和类方法的应用场景

  • 在后期的自动化测试过程中,在某些业务场景下,需要保证生成的对象始终只有一个时,就可以使用类对象及类属性和类方法。
  • 优点:简化方法的调用步骤(无需实例化对象,直接通过“类名.方法名()”即可调用)。

六、私有属性和私有方法

  • 在Python中,定义类的时候,可以给 属性和方法 设置访问权限,即规定在什么地方可以使用
  • 权限一般分为两种:公有权限、私有权限

1、公有权限

(1)定义

  • 直接定义的属性和方法就是公有的

(2)特点

  • 可以在任何地方访问或使用,只要有对象就可以访问和使用

2、私有权限

(1)定义

  • 当属性和方法只需要在类定义内部使用时, 就可以使用私有属性和私有方法
  • 只能在类内部定义(class关键字缩进中)
  • 只需要在 属性名 或方法名 ,前边加上两个下划线,这个方法或者属性就变为私有的
    • 私有属性: __属性名
    • 私有方法: __方法名()

(2)特点

  • 只能在当前类内部使用
  • 在类定义外部, 无论是通过类对象还是实例对象均无法获取私有属性和调用私有方法
  • 在继承关系中, 父类中 的私有属性和私有方法, 子类 同样无法获取和调用

(3)应用场景

  • 一般来说,定义的属性和方法都为公有的,某个属性不想在外部直接使用,定义为私有
  • 某个方法,是内部的方法(不想在外部使用),定义为私有

(4)调用方式

  • 在类定义内部,cls.__属性名/ cls.方法名()/self.__属性名/self.__方法名()

(5)私有属性和私有方法实例代码

class Women:
    def __init__(self,name):
        # 公有属性
        self.name = name
        # 私有属性
        self.__age = 18

    #  私有方法
    def __secret(self):
        # 在类内部,通过self.__私有属性名,访问私有属性
        print(f'我的年龄是{self.__age}')

xiaofang = Women('小芳')
# 私有属性,在类外部不能直接访问
# print(xiaofang.__age)
# 私有方法,类外部不能直接调用
# xiaofang.__secret()

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

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

相关文章

操作系统的概念,功能和目标

一、概念: 操作系统是指①控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以②提供给用户和其他软件方便的接口和环境,它③是计算机系统中最基本的系统软件。 二、功能和目标:…

零入门kubernetes网络实战-14->基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信测试案例

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章继续提供测试案例: 基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信 1、网络拓扑如下 2、网络拓扑构建…

【第二章】(1)了解系统内核和 Shell 终端的关系与作用

🐧2.1强大好用的Shell🧊1.什么是Shell?🧊2.Bash解释器的优势🐧2.2 执行命令的必备知识🧊1.Linux命令的格式🧊2.四个快捷键/组合键小技巧🧊1.什么是Shell? ​ 一台…

shell脚本的编写以及shell中语句(嵌入式学习)

shell学习shell脚本编写步骤shell变量功能性语句1.read2.expr3.let4.test逻辑运算符的书写格式结构性语句1.if…then…fi2、case...esac3、for..do..done4、while..do..doneshell脚本 将shell命令按照一定的逻辑顺序实现指定功能,放到一个文件中。文件叫脚本文件&a…

几个Base64编码工具,也有蹊跷

起因 需求:对一段内容进行base64加密,然后通过url的get请求进行发送到后台,由于加密的内容比较少,base64串也不是很长,我认为此方案可行。 于是找了三个base64编码的在线工具,分别是: 平台1&…

设计模式第六讲:责任链模式和迭代器模式详解

一. 责任链模式 1. 背景 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导…

【Java基础】020 -- 常见API

目录 一、游戏打包exe 二、Math 1、Math类的常用方法 ①、代码实现 2、小结 3、练习 ①、练习一:改进判断一个数是否为一个质数 ②、练习二:自幂数 三、System 1、时间原点 2、常用方法 3、课堂练习 4、注意事项 5、小结 四、Runtime 1、常用方法 2、练习…

微服务项目【商品秒杀接口压测及优化】

生成测试用户 将UserUtils工具类导入到zmall-user模块中,运行生成测试用户信息,可根据自身电脑情况来生成用户数量。 UserUtils: package com.xujie.zmall.utils;import com.alibaba.nacos.common.utils.MD5Utils; import com.fasterxml.j…

【黄啊码】我问ChatGPT如何学习PHP语言,它是这么说的

大家好,我是黄啊码,最近大家都在流行整chatGPT,今天它来了!别人都在吹嘘它万能,能够代替程序员写代码,今天我们就让它教教我们学习PHP语言: 黄啊码: 如何有效学习php语言&#xff1…

关于剩余电流动作继电器在配电系统中的应用探讨

摘 要:据了解,我国每年剩余电流动作继电器(RCD)的使用量超过2.7亿台,属于CCC认证产品,广泛应用于住宅、办公、商业、酒店、学校等民用建筑和数据中心及工业场所。 现在剩余电流动作继电器依据的标准是GB/T…

vue项目如何使用 SheetJS(xlsx)插件?

简言 SheetJS是一款非常好用的前端处理表格文件的工具。它分社区版和专业版,我们今天来介绍如何简单使用它的社区版。 SheetJS社区版官网 介绍 你应该打开官网浏览具体使用详情。 安装 打开官网在如上图的Installation板块中可以找到各种运行模块的使用方式。 …

MongoDB 覆盖索引查询

MongoDB 覆盖索引查询 官方的MongoDB的文档中对覆盖查询做了说明: 所有的查询字段是索引的一部分所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询…

【半监督医学图像分割 2023 CVPR】UCMT 论文翻译

文章目录【半监督医学图像分割 2023 CVPR】UCMT 论文翻译摘要1. 介绍2. 相关工作2.1 半监督学习2.2 半监督分割2.3 不确定性引导的半监督语义分割3. 方法3.1 问题的定义3.2 总览3.3 协作式均值教师3.4 不确定性指导混合4. 实验和结论5. 总结【半监督医学图像分割 2023 CVPR】UC…

webpack(4版本)使用

webpack简介:webpack 是一种前端资源构建工具,一个静态模块打包器(module bundler)。在 webpack 看来, 前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理。它将根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)…

sentinel持久化方案

一.sentinel规则推送原理 1.原有内存规则存储原理 (1)dashborad中请求到服务器后,在controller中通过http把规则直接推送给client,client接收后把规则放入内存; 2.持久化推送规则原理 ![在这里插入代码片](https://img-blog.csdnimg.cn/1…

质量保障体系建设演进案例

在业务早期发展阶段,主要是产品驱动、研发和测试互相配合。不同的测试方法是验证和保障交付质量的手段,而不是构建质量体系的基石。测试的努力带来的更多是一些“安全感”,而非安全保障。因此,要做到高质量的交付,就需…

k8s简单搭建

前言 最近学习k8s,跟着网上各种教程搭建了简单的版本,一个master节点,两个node节点,这里记录下防止以后忘记。 具体步骤 准备环境 用Oracle VM VirtualBox虚拟机软件安装3台虚拟机,一台master节点,两台…

Wails简介

https://wails.io/zh-Hans/docs/introduction 简介 Wails 是一个可让您使用 Go 和 Web 技术编写桌面应用的项目。 将它看作为 Go 的快并且轻量的 Electron 替代品。 您可以使用 Go 的灵活性和强大功能,结合丰富的现代前端,轻松的构建应用程序。 功能…

mac上安装mysql

mac上安装mysql1. 关于Linux上安装mysql2. 下载安装2.1 下载2.2 安装3. 客户端连接mysql3.1 先查看mysql服务3.2 连接mysql客户端3.2.1 终端使用命令连接3.2.2 可视化工具连接3.3 其他简单操作(启动服务等)3.3.1 可视化界面操作4. 配置环境变量4.1 配置环…

视图、索引、存储过程、触发器

视图、索引、存储过程、触发器 group by补充: 规范来说,分组查询中,select后的字段只能是group by的字段或者是聚合函数。mysql在这有一个小优化,分组后如果某个字段的所有记录相同,同样可以select。 视图 视图是虚拟…