Python学习笔记-面向对象程序设计

news2024/11/17 13:18:38

记述python中关于面向对象程序设计的使用。

一、面向对象概述

面向对象(Object Oriented),简称OO;

面向对象编程(Object Oriented Programming),简称OOP。

1.对象

英文为Object,表示任意示食物,与显示世界的实际事物一一对应。

对象包括:静态的属性和动态的行为。

2.类

对对象的封装。

3.面向对象程序设计的特点

  • 封装:将对象的属性 和行为封装起来
  • 继承:通过继承获取已封装对象,实现重复利用
  • 多态:子类继承父类同时实现自己的属性和方法,实现不同的效果

二、类的定义和使用

1.定义类

class ClassName:
    """类的注释"""
    statement
  • ClassName:类的名称
  • """类的注释""":类的注释性字符串,定义后,声明类的时候会显示该信息,输入类命和”(“后提示。
  • statement:类体,类的属性、方法等,若没有,可使用pass占位

2.类的实例化

ClassName(parameterlist)
  • ClassName:类的名称
  • parameterlist:可选参数,创建类时未声明__init__()方法或者该方法只有一个self参数时可省略。

3.创建__init__()方法

类似于C#中的构造方法,创建实例时自动运行,用来声明类的参数信息。

# 定义类
class ClassNmae:
    """ClassName"""
    def __init__(self):
        statement
  • __init__(self)声明方法时至少包含一个参数self,类似于C#中的this,表示自身
  • __init__()只有一个参数时,声明类的时候可以省略参数。

4.创建类的成员和访问

4.1 创建实例方法并访问

def functionName(self,parameterlist):
    block
  • functionName:方法名称
  • self:类的实例方法,定义时第一个参数必须为self
  • parameterlist:类的参数
  • block:类的具体代码段,实现类的功能

可以通过类的实例名称和"."进行访问:

instanceName.functionName(parametersvalue)
  • instanceName:实例化的类
  • functionName:类的方法名
  • prametersvalue:具体参数

4.2 创建属性成员并访问

4.2.1 类属性

在类中定义的属性,可以在所有实例化对象中使用,类的所有实例之间共享值,类似于C#中的静态属性。

# _*_ coding:utf-8 _*_


# 定义类
class ClassNmae:
    """ClassName"""
    parameter1 = value1
    parameter2 = value2
    def __init__(self):
        statement
  • 类属性声明时需要赋值
  • 类属性为所有实例共用,数值修改
  • 通过实例+属性名称或类名+属性名称方式访问属性
  • 使用"ClassName.parameterName"的格式可以动态添加类属、修改类属性

示例:

# _*_ coding:utf-8 _*_


# 定义类
class Work:
    """Work class"""
    name = "Student"
    remuneration = 10000
    num = 1
    def __init__(self):
        print("My sn:",Work.num)
        print("I'm work:",Work.name)
        print("Remuneration:",Work.remuneration)
        Work.num += 1
        
work1 = Work()
work2 = Work()
Work.year = 2022
work3 = Work()
print(work1.year)
print(work2.year)
print(work3.year)

结果:

========================== RESTART: D:\Desktop\Demo.py =========================
My sn: 1
I'm work: Student
Remuneration: 10000
My sn: 2
I'm work: Student
Remuneration: 10000
My sn: 3
I'm work: Student
Remuneration: 10000
2022
2022
2022
>>> 

注意

调用类属性时需要以"类命.属性名"的形式调用,否则会报错NameError。

 4.2.2 实例属性

只定义在类方法中的属性,只作用于当前实例。

# _*_ coding:utf-8 _*_


# 定义类
class ClassNmae:
    """ClassName"""
    def __init__(self):
        parameter1 = value1
        parameter2 = value2
        statement
  • 实例属性修改后不会影响其他实例的数据
  • 实例属性只能通过实例名+属性名进行i访问,实例属性通过类命进行访问会报错
  • 方法内部通过self+属性名进行实例属性访问

示例:

# _*_ coding:utf-8 _*_


# 定义类
class Work:
    """Work class"""
    def __init__(self):
        self.name = "Student"
        self.remuneration = 10000
        self.num = 1
        print("My sn:",self.num)
        print("I'm work:",self.name)
        print("Remuneration:",self.remuneration)
        self.num += 1
        
work1 = Work()
work2 = Work()
work1.name = "Student1"
work1.name = "Student2"
print(work1.name)
print(work1.name)

结果:

My sn: 1
I'm work: Student
Remuneration: 10000
My sn: 1
I'm work: Student
Remuneration: 10000
Student2
Student2

5.访问限制

python通过在方法和属性添加下划线来进行访问权限限制

标识说明备注
首尾双下划线定义特殊方法,一般是系统定义名字如:__init__()
单下划线开头

protected(保护)类型

只允许本身和子类进行访问,不能使用”from module import *”导入,可以使用实例进行访问

如:_name = "a"
双下划线开头

private(私有)类型;

只允许定义该方法的类本身访问,而且也不能通过类的实例访问。

可以通过“类的实例名._类名__xxx”进行访问

示例:

# _*_ coding:utf-8 _*_


# 定义类
class Work:
    """Work class"""
    _name = "work"
    __remuneration = 10000
    def __init__(self):
        print("I'm work:",Work._name)
        print("Remuneration:",Work.__remuneration)
        
work1 = Work()
work2 = Work()

print("Work._name:",Work._name)                 # 访问保护变量
print("work1._name:",work1._name)
print("work2._name:",work2._name)
print("Work.__remuneration:",work1._Work__remuneration)     # “实例名._类命__xxx”访问私有变量
print("Work.__remuneration:",Work.__remuneration)           # 直接访问私有变量会报错

结果:

I'm work: work
Remuneration: 10000
I'm work: work
Remuneration: 10000
Work._name: work
work1._name: work
work2._name: work
Work.__remuneration: 10000
Traceback (most recent call last):
  File "D:\Desktop\Demo.py", line 20, in <module>
    print("Work.__remuneration:",Work.__remuneration)
AttributeError: type object 'Work' has no attribute '__remuneration'
>>> 

三、属性(property)

1.用于计算的属性

通过@property装饰器将一个方法转换为属性,转换为属性后可直接通过方法名访问方法,不在需要添加“()”,类似于C#中用{get;set;}访问器访问属性。

格式如下:

@property
def methodName(self):
    block
  • 通过@property转换后的属性不能进行赋值,否则会报错AttributeError

2.为属性添加保护机制

  • 使用@property装饰器可以将方法转换为只读属性
  • 通过"@属性.setter"为属性设置拦截器来修改属性

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

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

相关文章

IMX6ULL学习笔记(13)——GPIO接口使用【汇编方式】

一、GPIO简介 i.MX6ULL 芯片的 GPIO 被分成 5 组,并且每组 GPIO 的数量不尽相同&#xff0c;例如 GPIO1 拥有 32 个引脚&#xff0c; GPIO2 拥有 22 个引脚&#xff0c; 其他 GPIO 分组的数量以及每个 GPIO 的功能请参考 《i.MX 6UltraLite Applications Processor Reference M…

vTESTstudio入门到精通 - vTESTstudio工程创建_01

入行车载网络测试多年以来,最大的困扰就是网上几乎无法搜到工作中常见的问题答案,特别是vTESTstudio的工程和开发相关的问题,在晚上几乎就是一片未知的大陆,偶尔有几篇同行写的,基本也都是某个问题或者某个demo的创建基础讲解,至今我还未找到有博主将vTESTstudio从入门的…

艾美捷—如何选择合适的SAM甲基转移酶活性分析试剂盒?

SAM&#xff0c;也称为 AdoMet&#xff0c;充当修饰蛋白质和 DNA 所需的甲基的供体。SAM 的异常水平与许多异常有关&#xff0c;包括阿尔茨海默氏症、抑郁症、帕金森氏症、多发性硬化症、肝功能衰竭和癌症。 市面上&#xff0c;SAM甲基转移酶酶活性分析试剂盒非常少&#xff0c…

ccf历年第二题满分python代码及知识点总结(2013-2022)

201312-2ISBN号码 思路&#xff1a; 就是简单的字符串处理&#xff0c;没有什么好说的。 代码&#xff1a; str_input input() s str_input.replace("-", "") sum_value 0 start 1 for i in range(len(s)-1):sum_value int(s[i]) * startstart 1…

AI-多模态-2021:ALIGN【】

https://arxiv.org/abs/2102.05918 【写在前面】 学习良好的视觉和视觉语言表征对于解决计算机视觉问题(图像检索、图像分类、视频理解)是至关重要的&#xff0c;目前&#xff0c;预训练的特征在许多NLP任务中已经展现了非常大的潜力。虽然NLP中的表示学习已经可以用没有人工…

消息队列基础

消息队列的应用场景 异步处理&#xff0c;提升吞吐量 削峰填谷&#xff0c;平滑流量冲击 应用解耦&#xff0c;提升系统可用性 消息通讯&#xff0c;点对点消息通讯 消息模型 点对点模式 生产者生产消息到队列服务器&#xff0c;消费者消费消息&#xff0c;并发送确认收到…

Redis Cluster 扩容实战

Redis Cluster 扩容 接着上一篇Redis Cluster 单机集群部署&#xff0c;今天学习下Redis Cluster 架构在实际应用中如何面对各种复杂的场景&#xff0c;如&#xff1a; 扩容 - 增加节点缩减 - 删除节点宕机 - 主节点服务异常 增加节点 随着集群需求的变化&#xff0c;系统人…

smart-doc 文档生成器实战

文章目录一、部署二、代码演示1.类、方法注解2.执行、生成html 或 markdown文档三、参考文档一、部署 1.基于SprinBoot项目&#xff0c;加入pom.xml加入依赖<build><plugins><!-- 打包跳过测试 --><plugin><groupId>org.springframework.boot&l…

[附源码]计算机毕业设计高校学生宿舍管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

若依微服务版登录流程源码分析2

接上篇&#xff0c;后端接收到“/code”请求并将其转发至ValidateCodeHandler处理 生成验证码 进入ValidateCodeServiceImpl#createCaptcha 这块代码比较简单&#xff0c;就不多赘述 /** * 生成验证码 */ Override public AjaxResult createCaptcha() throws IOException, C…

VM 找不到虚拟磁盘 000001.vmdk 一种排查思路

报错内容“ 找不到文件: E:\win10\Windows 10 x64-000001.vmdk 开启此虚拟机需要用到此文件。如果移动了此文件&#xff0c;请提供它的新位置。 ” 它明明就在哪里&#xff0c;却提示找不到&#xff01;气死 这个时候可以打开“vmware.log” 查看报错内容。 比如我的核心报…

从零开始学Java之Java到底是个啥?

全文大约 【 5000】 字&#xff0c;不说废话&#xff0c;只讲可以让你学到技术、明白原理的纯干货&#xff01;文章带有丰富案例及配图、视频&#xff0c;只为让你更好的理解和运用文中的技术概念&#xff0c;给你带来具有足够启迪的教程...... -----------------------------…

基础数据结构链表

链表是一种常见的基础数据结构&#xff0c;结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配&#xff0c;也就是说&#xff0c;链表是一个功能极为强大的数组&#xff0c;他可以在节点中定义多种数据类型&#xff0c;还可以根据需要随意增添&#xff0c;删除&…

论文速递:带重力约束的点云配准(Gravity-constrained point cloud registration)

标题&#xff1a;Gravity-constrained point cloud registration 作者&#xff1a;Vladim ́ır Kubelka, Maxime Vaidis and Franc ̧ois Pomerleau&#xff0c;加拿大拉瓦尔大学 来源&#xff1a;IROS 2022 摘要 视觉和激光SLAM算法从IMU中获益良多。高频率的IMU数据弥补了…

嵌入式:ARM的流水线技术

三级流水线ARM的组织 ARM的3级流水线介绍 到ARM7为止的ARM处理器使用的简单3级流水线分别为 取指级 &#xff1a;读取指令。译码级 &#xff1a;对指令进行译码。占有“译码逻辑”&#xff0c;不占有“数据路径”。执行级 &#xff1a;指令占有“数据路径”&#xff0c;寄存…

拼搏别样的未来,中国社科院与美国杜兰大学金融管理硕士项目助力你的人生旅程

你憧憬中的未来是什么样子呢&#xff1f;我们的人生路程充满了众多可能性&#xff0c;只要努力就会收获自己的别样人生。我们的人生不是单一的色彩&#xff0c;它是五彩斑斓、精彩纷呈的。在每一个阶段的我们所拥有当时的状态并不能代表永远&#xff0c;随着我们的拼搏与奋斗&a…

2022全年度空调十大热门品牌销量榜单

今年空调的销售得到明显改善&#xff0c;尤其是今年夏天全国多地最高气温同比明显提升&#xff0c;且高温的强度和持续时间还具有一定的极端性。随着气温的骤升&#xff0c;空调市场也迅速升温&#xff0c;各终端销售量出现明显增长。 根据鲸参谋数据统计&#xff0c;今年京东平…

“美亚杯”第五届中国电子数据取证大赛答案解析(个人赛)

A C D 分区5为系统分区 A 1073741824*458.29492085140520.96 E A A E D B 无答案 C 搜索各选项&#xff0c;C项搜不到 B C E 使用火绒剑查看进程调用的动态链接库 C 仿真得 B 内存大小为3G&#xff0c;在系统盘根目录过滤大小在2-8G之间的文件 D Win10时间线信息存放的数…

代码随想录算法训练营第六天| 哈希表理论基础 ,242.有效的字母异位词 , 349. 两个数组的交集 ,202. 快乐数,1. 两数之和

代码随想录算法训练营第六天| 哈希表理论基础 &#xff0c;242.有效的字母异位词 &#xff0c; 349. 两个数组的交集 &#xff0c;202. 快乐数&#xff0c;1. 两数之和 哈希表理论基础 建议&#xff1a;大家要了解哈希表的内部实现原理&#xff0c;哈希函数&#xff0c;哈希碰…

PAT 乙级 1078字符串压缩与解压 python

题目 思路&#xff1a; 生成两个函数&#xff1a;压缩与解压 在压缩中利用flag保留前一个字符串 再利用count统计重复出现字母的个数 如果目前遍历到的字母和flag相同&#xff0c;则count1 反之&#xff0c;说明重复结束 在解压中&#xff0c;如果遇到数字&#xff0c;表示需…