学习日志009--面向对象的编程

一、面向对象

面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它使用“对象”来设计应用程序和计算机程序。它利用了抽象、封装、继承和多态这些概念。

一、面向对象编程的核心概念

封装(Encapsulation)
封装是面向对象编程的一个主要特征,它将对象的数据(属性)和操作这些数据的方法(行为)结合在一起,形成一个独立的对象。这样做的好处是可以隐藏内部的复杂性,只暴露有限的接口给外部使用。在python中,通常通过设置成员变量为私有(双下划线)来实现封装,并提供公共的方法来访问和修改这些变量。
继承(Inheritance)
继承允许新创建的类(子类)继承现有类(父类)的属性和方法。这意味着可以在现有类的基础上构建新的类,从而重用和扩展现有代码。在pthon中,继承是通过类名后的小括号来实现的。
多态(Polymorphism)
多态性是指允许不同类的对象对同一消息作出响应的能力。简单来说,就是允许使用父类类型的引用指向子类的对象。这样,同一个接口可以用来调用不同的实现方法,这些方法可能属于不同的类。

二、面向对象编程的优势

提高代码的重用性:通过继承机制,可以使用现有的代码作为基础,然后通过扩展来实现特定的功能。
提高代码的可维护性:封装使得代码更加容易理解和维护,因为可以独立地修改对象内部的实现,而不影响使用它的代码。
实现代码的可扩展性:面向对象编程提供了框架,使得程序可以在不修改原有代码的基础上增加新的功能。

二、类与对象

1.概念

对象:在我们之前的学习中遇到的一切都是对象,包括不限于字符串,列表,甚至是1,2,3这样的数值,可以说一切的python代码都是有一个个对象构成的。对象就是python的基本单位。

类:类是同种对象的聚合体。类将对象包装起来,每种类都有其自己的独特共性。譬如:1,2,3这样的数值类,他们可进行各种运算。也就是说类也是一种对象

2.类的定义与实例化对象

那么,我们该如何创建属于自己的类呢?

与函数类似,我们用类的关键字声明类,并在后面加上小括号,写入诺干个继承对象。

class my_class(objection):pass

这样我们就创建好自己的类了

我们还可以在其中写入种种,来丰富我们的类。

我们创建好类之后该怎样使用吗

还记得我们我们是如何输入值给列表的吗

 ls = [1,2,3]ls.append(4)

根据此我们使用我们的类的使用方法也就明晰了

class my_class(object):passi = my_class()

至此,我们创建类,并完成类的实例化

3.访问属性和方法

类中可以编写许多属性,与方法。如果我们想使用他们时该如何做的。

想想之前的列表是如何添加元素,我们也要进行类似的操作


class my_class(object):f_1 = '属性1'def fun_1(self):return "方法一"i = my_class()
print(i.f_1)
print(i.fun_1())

类内部与变量类似的部分称之属性,与函数类似的部分称之为方法

4.类与对象关系 

通过上面介绍我们得知了类与对象的关系

  1. 对象拥有类的所有属性和方法
  2. 对象的属性和方法可以单独添加、删除、修改
  3. 对象与对象之间的属性和方法不可共享
  4. 对象不能独自创建,必须依托于类,类可以实例化N个对象

 5.魔方方法

与赋值类似,为了方便使用类,我们可以使用一种叫魔方方法的方式来改写我们的类

  1. __init__ 构造函数:完成对象的初始化工作,方便统一管理、调用类创建对象时,自动执行。
  2. __del__ 析构函数:删除对象时执行一些操作,自动执行。
  3. __str__ 打印方法:输出执行信息,自动执行。
    class my_class(object):def __init__(self):print("类的创建")def __str__(self):return "我是一返回"def __del__(self):print("我的出现表明类结束了")i = my_class()
    print(i)

当然,魔方方法不止这些,他们出现往往伴随着两端的双下划线

6.属性与方法

通过之前的介绍,我们明白了什么是属性什么是方法。我们发现我们平时使用的类中,他们并不是老老实实地呆在一起,那么为什么会这样。我们接下来就要介绍他们的不同

class Student(object):school = "10023"def __init__(self,n):self.id = n@classmethoddef show_info(cls):print(f"学校id:{cls.school}")def show_id(self):print(f"学生id:{self.id}")@staticmethoddef show_none():print("我是与世无争的静态方法")s1 = Student("张三")
s1.show_id()
Student.show_info()
s1.show_none()

 7.函数内置类方法

  • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
  • __doc__ :类的文档字符串
  • __name__: 类名
  • __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
  • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

三、封装

接下来,我们开始介绍类的三大特性

封装是类的三大特性之一。
封装指的是隐藏对象中一些不希望让外部所访问的属性或方法。
python中封装其实是通过设置访问权限来体现的,私有属性和私有方法是控制访问权限的组成部分。

 私有属性与私有方法


在类的内部使用,不希望外部直接访问的变量。以此达到保护的目的在python中,使用双下划线作为前缀来定义私有属性。私有属性在类外不能访问

 与私有属性类似,方法也用于同样的是由规则。为了使用它们我们专门设置开口,用来输入输出私有属性与方法

class Car(object):def __init__(self,name,color):self.__name = nameself.__color = colordef __show(self):return f"那辆{self.__name}是{self.__color}"def show(self):return self.__show()def color(self):return self.__color
i = Car('玛莎拉蒂','红色的')
print(i.color())
print(i.show())

属性装饰器 

 我们在写完发现每次使用类内的属性都需要加上小括号,既然变量能直接赋值,我们能否有方法更直接使用这些属性。这时候就到属性装饰器登场了

属性装饰器是实现把方法转为属性的装饰器。

作用:

  1. 把方法转为属性,便于操作属性
  2. 实现对属性的更改(验证)、查看、删除
    class 类名(object):def __init__(self):self.__名字 = xxx@propertydef 函数名(self):return self.__名字@函数名.setterdef 函数名(self, m):self.__名字 += m

class Car(object):def __init__(self,name,color):self.__name = nameself.__color = colordef __show(self):return f"那辆{self.__name}是{self.__color}"def show(self):return self.__show()@propertydef color(self):return self.__color@color.setterdef color(self,n):self.__color = n
i = Car('玛莎拉蒂','红色的')
print(i.color)
print(i.show())
i.color = '白色的'
print(i.color)

 

四、继承

 面向对象的编程带来的主要好处之一就是代码的重用,实现这种重用的方法之一就是通过继承机制。
通过继承创建的新类称之为【子类】或者【派生类】,被继承的类称之为【父类】、【基类】、【超类】

简单来说,我们可以通过子类来访问父类的属性和方法

class A(object):def __init__(self,x,y):self.x = xself.y = ydef __str__(self):return f"{self.y} and {self.x}"class B(A):pass
b =B(1,2)
print(b)

 我们实际需求中,面对的问题往往仅仅依靠父类是解决不了的,我们还需要一些自己的办法。

此时就需要我们,重写方法

class A(object):def __init__(self,x,y):self.x = xself.y = ydef my_add(self):return self.x+self.yclass B(A):def __init__(self,x,y,z):super().__init__(x,y)self.z = zdef my_add(self):return super().my_add() + self.z
b =B(1,2,3)
print(b.my_add())

五、多态性

就像谚语中说的,老鼠的孩子会打洞,继承的子类多多少少会拥有父类的方法和属性。也会有龙有九子,各不相同。根据实际需求,不同子类继承同个父类的同个方法也会出现不同的结果

class Animals(object):def __init__(self,name):self.name = namedef call(self):return f"{self.name}在叫"class Dog(Animals):def call(self):return super().call()+"汪汪汪"class Cat(Animals):def call(self):return super().call() + "喵喵喵"
d = Dog('小狗')
print(d.call())
c = Cat('小猫')
print(c.call())

 

 

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

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

相关文章

Sorvall Legend Micro 17 微量离心机产品特性

在科研实验中,微量离心机扮演着至关重要的角色。其中,Thermo Scientific Sorvall Legend MicroCL 17R 微量离心机凭借其出色的性能和紧凑的设计,成为众多科研人员的首选。 这款微量离心机体积小巧,非常适合空间有限的实验室。它支…

Camp4-L2:InternVL 多模态模型部署微调实践

书生浦语大模型实战营第四期:InternVL 多模态模型部署微调实践 教程链接:https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/InternVL视频链接:https://www.bilibili.com/video/BV1nESCYWEnN/任务链接:https://github.co…

Unity内置渲染管线升级URP,使用ShaderGraph

问题描述 在内置渲染管线的工程中,导入之前通过ShaderGraph制作的Shader。 文件不可打开,我们需要升级成URP 过程记录 当前Unity版本 2022.3.49 安装Package 创建配置文件 Assets -> Rendering -> URP Asset 创建成功 修改配置 Edit->P…

MYSQL 修改表的结构

在项目的实际开发中,随着版本的迭代和需求的变更,经常会对表结构进行调整,比如向现有表中添加列,删除列,或者修改某列的列名、数据类型或长度,这时就需要对表进行修改操作。 修改表结构语法 ALTER TABLE t…

夹耳开放式耳机好用吗?夹耳开放式耳机推荐

夹耳式耳机作为开放式耳机的一种,在最近几年里深受大家欢迎。它能够受到大家欢迎的原因主要是其不入耳的特性,既有助于保护听力健康,又能让人尽情享受极致的音乐体验。不过,很多小伙伴不知道夹耳式耳机到底好不好用?夹…

React--》掌握openapi-typescript-codegen快速生成API客户端代码

今天深入探索一个神奇的工具——openapi-typescript-codegen。它不仅能够帮助你快速生成TS代码,还能让你的API请求更加高效、类型安全,让开发者摆脱手动编写冗长请求代码的困扰,专注于实现业务逻辑。接下来让我们一起来了解它的强大功能和使用…

【C++】类中的“默认成员函数“--构造函数、析构函数、拷贝构造、赋值运算符重载

目录 "默认"成员函数 概念引入: 一、构造函数 问题引入: 1)构造函数的概念 2)构造函数实例 3)构造函数的特性 4)关于默认生成的构造函数 (默认构造函数) 默认构造函数未完成初始化工作实例: 二…

中仕公考怎么样?事业编面试不去有影响吗?

事业编考试笔试已经通过,但是面试不去参加会有影响吗? 1. 自动放弃面试资格:未能按时出席事业单位的面试将被视为主动放弃该岗位的竞争机会。 2. 个人信誉问题:面试作为招聘流程的关键步骤,无故缺席可能被解释为诚信…

websocket初始化

websocket初始化 前言 上一集我们HTTP的ping操作就可以跑通了,那么我们还有一个协议---websocket,我们在这一集就要去完成我们websocket的初始化。 分析 我们在初始化websocket的之前,我们考虑一下,我们什么时候就要初始化我们…

Unity中HDRP设置抗锯齿

一、以前抗锯齿的设置方式 【Edit】——>【Project Settings】——>【Quality】——>【Anti-aliasing】 二、HDRP项目中抗锯齿的设置方式 在Hierarchy中——>找到Camera对象——>在Inspector面板上——>【Camera组件】——>【Rendering】——>【Pos…

Linux系统任务管理

文章目录 系统任务管理atcron 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2024年11月14日11点20分 系统任务管理 任务管理 计划执行:特定时间运行一次:at 定期执…

(附项目源码)Java开发语言,springboot 民宿管理系统的设计与实现 57,计算机毕设程序开发+文案(LW+PPT)

目 录 摘 要 1 绪论 1.1 研究背景 1.2 研究意义 1.3 主要研究内容 1.4 论文章节安排 2 相关技术介绍 2.1 Java编程语言 2.2 MySQL数据库 2.3 springboot框架 3 系统分析 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 操作可行性分析 3.2 …

IDEA热部署(简单死了!)

真的很简单很简单,我之前看别的博主,很多都讲的很复杂,我哭 步骤一: 步骤二: 步骤三: 步骤四: 到这里就结束啦~ 最后很重的是: 1.启动项目时候,必须使用debug方式启…

基于java+springboot+layui的流浪动物交流信息平台设计实现

基于javaspringbootlayui的流浪动物交流信息平台设计实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系…

Spring Boot框架:构建可扩展的网上商城

4 系统设计 网上商城系统的设计方案比如功能框架的设计,比如数据库的设计的好坏也就决定了该系统在开发层面是否高效,以及在系统维护层面是否容易维护和升级,因为在系统实现阶段是需要考虑用户的所有需求,要是在设计阶段没有经过全…

「Py」模块篇 之 PyAutoGUI库自动化图形用户界面库

✨博客主页何曾参静谧的博客📌文章专栏「Py」Python程序设计📚全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…

打造透明、高效的分布式系统:通过 EMQX ECP 集成实现链路追踪功能

链路追踪作为一种用于监控和观察分布式系统中请求流动和性能的技术,在现代微服务架构中扮演着重要角色。 在复杂的分布式环境中,它可以记录并可视化跨多个服务与组件的完整请求路径,并提供每个服务节点上的执行时间,帮助开发人员…

sql数据库-聚合函数-DQL(类似Excel函数)

目录 聚合函数介绍 语法 举例 统计表中的所有女性员工 统计表中工作地点在北京的员工 聚合函数介绍 常用的聚合函数 函数功能count统计字段数量max最大值min最小值avg平均值sum求和 语法 SELECT 聚合函数(字段列表) FROM 表名; 举例 统计表中的所有女性员工 sele…

【C语言刷力扣】58.最后一个单词的长度

题目: 解题思路; 倒序遍历,先将末尾的空格过滤,再统计至第一个空格。 条件i > 0 放在前面先判断,条件s[i] ! 放后面,反之遇到单字符会溢出。 时间复杂度: 空间复杂度: int lengthOfLas…

【数据运营】数据资产私域运营:探索并实现数据价值变现的新途径

随着数字化浪潮的席卷,数据已成为现代企业的核心竞争力之一。然而,仅仅拥有数据并不足以在激烈的市场竞争中脱颖而出,关键在于如何有效地管理和运营这些数据资产,将其转化为实实在在的商业价值。本文将从数据资产私域运营的定义、…