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

news2024/12/23 10:15:40

一、面向对象

面向对象编程(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):
    pass

i = 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

    @classmethod
    def show_info(cls):
        print(f"学校id:{cls.school}")

    def show_id(self):
        print(f"学生id:{self.id}")

    @staticmethod
    def 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 = name
        self.__color = color

    def __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
        
        @property
        def 函数名(self):
            return self.__名字
        
        @函数名.setter
        def 函数名(self, m):
            self.__名字 += m

class Car(object):
    def __init__(self,name,color):
        self.__name = name
        self.__color = color

    def __show(self):
        return f"那辆{self.__name}是{self.__color}"

    def show(self):
        return self.__show()

    @property
    def color(self):
        return self.__color

    @color.setter
    def 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 = x
        self.y = y

    def __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 = x
        self.y = y

    def my_add(self):
        return self.x+self.y


class B(A):
    def __init__(self,x,y,z):
        super().__init__(x,y)
        self.z = z
    def 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 = name

    def 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.coloradmin.cn/o/2239730.html

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

相关文章

Redis8:商户查询缓存2

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…

在 WPF 中,如何实现数据的双向绑定?

在 WPF 中,数据绑定是一个非常重要的特性,它允许 UI 与数据源之间自动同步。双向绑定是一种常见的绑定方式,当数据源更新时,UI 会自动更新;同样,当 UI 中的元素(如文本框)发生改变时…

DAY6 线程

作业1&#xff1a; 多线程实现文件拷贝&#xff0c;线程1拷贝一半&#xff0c;线程2拷贝另一半&#xff0c;主线程回收子线程资源。 代码&#xff1a; #include <myhead.h> sem_t sem1; void *copy1()//子线程1函数 拷贝前一半内容 {int fd1open("./1.txt",O…

# filezilla连接 虚拟机ubuntu系统出错“尝试连接 ECONNREFUSED - 连接被服务器拒绝, 失败,无法连接服务器”解决方案

filezilla连接 虚拟机ubuntu系统出错“尝试连接 ECONNREFUSED - 连接被服务器拒绝&#xff0c; 失败&#xff0c;无法连接服务器”解决方案 一、问题描述&#xff1a; 当我们用filezilla客户端 连接 虚拟机ubuntu系统时&#xff0c;报错“尝试连接 ECONNREFUSED - 连接被服务…

网安数学基础-同余关系

文章目录 参考等价关系实例 同余同余和等价同余的运算 乘法逆元一次同余方程消去律 剩余类中国剩余定理欧拉函数欧拉定理 费马小定理 参考 【一口气学完】密码学的数学基础2&#xff0c;《同余关系》&#xff0c;一小时学完 等价关系 三角形里的全等关系 等价关系定义 下面这…

高校数字校园建设的数字身份管理难题

近年来&#xff0c;我国高等院校在《中国教育现代化2035》战略的要求下&#xff0c;在《高等学校数字校园建设规范&#xff08;试行&#xff09;》的指引下&#xff0c;掀起了数字校园建设高潮。借助教学、科研、管理、服务等种类的业务应用&#xff0c;高校提升了业务的数字化…

HDLC和PPP原理与配置

HDLC:高级数据链路控制 PPP:点到点协议 PPP:包括LCP链路控制协议,用于各种链路协议层参数的协商内容包括最大接收单元MRU,认证方式,魔术字等选项. NCP:网络控制协议,用于各网络层参数的协商,更好地支持了网络层协议. PAP:口令认证. CHAP:质询握手认证协议 PPP有两种验证方式…

Oracle数据库 查看SQL执行计划的几种方法

前言 在日常的运维工作中&#xff0c;SQL优化是DBA的进阶技能&#xff0c;SQL优化的前提是要看SQL的执行计划是否正确&#xff0c;下面分享几种查看执行计划的方法&#xff0c;每一种方法都各有各的好处&#xff0c;可以根据特定场景选择某种方法。 一.使用AUTOTRACE查看执行…

Hbase Shell

一、启动运行HBase 首先登陆SSH&#xff0c;由于之前在Hadoop的安装和使用中已经设置了无密码登录&#xff0c;因此这里不需要密码。然后&#xff0c;切换至/usr/local/hadoop&#xff0c;启动Hadoop&#xff0c;让HDFS进入运行状态&#xff0c;从而可以为HBase存储数据&#…

31-2 智能驾驶系统

智能驾驶功能分类 安全类功能 纵向 FCW/AEB FCTA/FCTB/RCTA/RCTB RVW/RVB 横向 ESA LSS LKA/LDW/ELK 盲区安全辅助 BSD LCA DOW CVW 舒适功能类 纵向 ACC CSA TSR ISA 横向 LCC ILC ALC 横纵向 TJA/HWA NOP 泊车功能 RAP 蓝牙通信&#xff0c;环视超车波 HPA 记忆泊车…

ubuntu20.04_从零LOD-3DGS的复现

环境要求 dependencies:- cudatoolkit11.6- plyfile0.8.1- python3.7.13- pip22.3.1- pytorch1.12.1- torchaudio0.12.1- torchvision0.13.1- tqdm1. 安装conda创建环境 conda create -n lod-3dgs python3.7.132. 安装CUDA11.6和相应cuDNN。 2.1 CUDA CUDA安装参考CUDA10.1…

Linux:网络协议socket

我们之前学的通信是本地进程间通信&#xff0c;如果我们想在网络间通信的话&#xff0c;就需要用到二者的ip地址&#xff0c;分别被称为源IP地址和目的IP地址&#xff0c;被存入ip数据包中&#xff0c;其次我们还需要遵循一些通信协议。 TCP协议&#xff1a;传输层协议&#x…

Leetcode - 143双周赛

目录 一&#xff0c;3345. 最小可整除数位乘积 I 二&#xff0c;3346. 执行操作后元素的最高频率 I 1.差分数组 2.同向三指针 滑动窗口 三&#xff0c; 3348. 最小可整除数位乘积 II 一&#xff0c;3345. 最小可整除数位乘积 I 本题直接暴力枚举&#xff0c;题目求 >n…

Springboot3 配置Swargger3.0版本

一、swagger 版本配置&#xff0c;我用的3.0.0 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version></dependency>二、说明&#xff1a;springdo…

error MSB3325:无法导入以下密钥文件xxx,该密钥文件可能受密码保护

错误提示信息(类似如下)&#xff1a; error MSB3325: 无法导入以下密钥文件: F:\...\Common.pfx。该密钥文件可能受密码保护。若要更正此问题&#xff0c;请尝试再次导入证书&#xff0c;或手动将证书安装到具有以下密钥容器名称的强名称 CSP: VS_KEY_A65F207BE95F57D0 出现此…

喜报|超维机器人荣获昇腾AI创新大赛铜奖

近日&#xff0c;在备受瞩目的昇腾AI创新大赛中&#xff0c;超维机器人凭借扎实的技术实力和创新产品&#xff0c;荣获大赛铜奖。这一荣誉不仅展现了超维机器人在智能巡检领域的技术创新与突破&#xff0c;也标志着超维机器人的智能巡检解决方案在人工智能领域获得了广泛认可&a…

[[nodiscard]] 使用说明

1 作用 [[nodiscard]] 属性&#xff1a;这个属性可以用于函数或者返回类型。它的作用是告诉编译器&#xff1a;调用这个函数时&#xff0c;它的返回值不应被忽略。如果程序员调用了这样的函数但没有使用它的返回值&#xff0c;编译器会发出警告。这对于那些返回重要状态或错误…

golang分布式缓存项目 Day4 一致性哈希

注&#xff1a;该项目原作者&#xff1a;https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习 为什么使用一致性哈希 我该访问谁 对于分布式缓存来说&#xff0c;当一个节点接收到请求&#xff0c;如…

MySQL数据库专栏(四)MySQL数据库链接操作C#篇

摘要 本篇文章主要介绍C#链接MySQL数据库的接口介绍&#xff0c;使用实例及注意事项&#xff0c;辅助类的封装及调用实例&#xff0c;可以直接移植到项目里面使用。 目录 1、添加引用 2、接口介绍 2.1、MySqlConnection 2.2、MySqlCommand 2.3、MySqlDataReader…

借助 Pause 容器调试 Pod

借助 Pause 容器调试 Pod 在 K8S 中&#xff0c;Pod 是最核心、最基础的资源对象&#xff0c;也是 Kubernetes 中调度最小单元。在介绍 Pause 容器之前需要先说明下 Pod 与容器的关系来理解为什么需要 Pause 容器来帮助调试 1. Pod 与 容器的关系 Pod 是一个抽象的逻辑概念&…