python面向对象知识点

news2025/1/20 16:17:19

因为我之前学过Java,所以下文中的python面向对象知识点会和Java面向对象知识点比较记忆;

python类的定义

python类的定义个其函数的定义格式相同,为此先复习函数定义格式

def add(num1, num2){
    return num1 + num2
}

类定义格式类的定义时类名后面没有括号,当然也可以添加括号,用于类的继承,后面会说:

class User:
    name = None,
    age = None,

    def speak(self):
        print("我在说话")
    
    def eat(self):
        print("我在吃饭")

user1 = User()

类的组成

python类的组成和Java相似,都有属性、方法、私有属性、私有方法、构造方法等等;

属性和方法没的说,我们只简单的提一下他们如何调用:

class User:
    name = "zhangsan",
    age = 23,
    gender = "男",

    def printname(self):
        print(self.name)

user = User()
user.printname() 
print(user.age)

这里的代码中提到了self,是什么呢?

self

其实python中的self和java中的this一样,都是值当前对象本身,我们可以通过self在成员方法了内部调用成员变量;

//Java代码(this)
public void setRadius(double radius) {
        this.radius = radius;
    }
# python代码(self)
class User:
    name = "zhangsan",
    age = 23,
    gender = "男",

    def printname(self):
        print(self.name)

构造方法

python中这点和java一样,类都有构造器,只不过构造方法的名字取值方式不一样;java中构造方法的名字必须和类名一致,而Python的构造方法名是固定的def __init__(self):;还有一点就是虽然你的构造方法名是__init__但是你创建对象的时候,仍然使用的类名加()案例如下;

class User:
    name = None,
    age = None,
    gender = None,

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender


 user2 = User("lisi", 34, "nv" )

在python中如果你不显示的给出构造方法,python底层会为你隐式的给出一个无参构造法方法:

but 一旦你显式的给出含参构造方法,那么就不能直接无参的创建对象了,python中无参和有参构造只能存一个;这点和java有区别,java是同时无参和含参构造函数存在,但是python不一样,要注意;

class User:
    name = None,
    age = None,
    gender = None,

    def __init__(self, ):
        pass

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

user = User() 

最后一行代码会报错:

TypeError: User.__init__() missing 3 required positional arguments: 'name', 'age', and 'gender'

 上述代码中虽然有无参构造和含参构造,但其实后面的构造方法将前面的构造方法覆盖了,因此只能存在一个构造方法;

在 Python 中,构造函数 __init__(self) 只能有一个,并且它必须至少带有一个 self 参数。如果你想定义一个有参构造函数,你需要在该方法中显式地定义所需的参数。如果你想定义一个无参构造函数,你需要定义一个仅带有 self 参数的 __init__ 方法。当然你什么都不给,系统会为你默认给出无参构造方法;

def __init__(self):
        pass

私有属性和私有方法

python和java一样都支持私有化属性或者方法,但Java采用的是给变量添加关键字private,如下列代码:

private static double pi = 3.14;
private double radius;

而python是通过变量名和方法名的格式来判断是否是私有化的,例如如果你需要将一个属性或者方法变成私有化的,就在其变量名之前加__两个下划线,案例如下:

class User:
    __name = None,
    __age = None,
    __gender = None,

user = User()
print(user.__age) #报错

最后一句代码就会报错:

AttributeError: 'User' object has no attribute 'age'

当然你可以在类的方法中使用self调用私有属性如下:

class User:
    __name = None,
    __age = None,
    __gender = None,

    def printname(self):
        print(self.__name)

user = User()
user.printname()

这段代码是正常的;

继承

python中支持多继承吗?

是的,Python语言支持多继承。所谓多继承,即一个类可以同时从多个父类中继承属性和方法。

在Python中,如果需要创建一个类并从多个父类中继承,可以使用如下的语法:

class ChildClass(ParentClass1, ParentClass2, ...):

        在这个定义中,ChildClass称作子类,ParentClass1、ParentClass2等则称作父类。子类会继承所有父类的属性和方法,并可以根据需要添加自己的属性和方法。

        当子类继承了多个父类时,如果有父类之间存在同名方法或属性,Python会按照一定的算法来确定优先级。Python通过使用C3算法来解决多继承时的方法解析顺序(MRO)问题,确保每个方法只被调用一次,并且保证继承顺序对方法解析的影响最小化。

        虽然多继承可以方便地重用代码,但也可能会导致设计上的复杂性和混乱。因此,在使用多继承时,应该根据实际情况进行权衡,并尽量避免过度使用;

子类调用父类的成员

        在学习了python的继承知识点之后,随之而来的就是python的继承中的复写,即父类的方法并不能够完全提供子类的使用场景,或者子类想要扩展父类的方法的能力,所以子类会重写父类的方法或者属性;这点和Java一样,就不赘述了;

        当我们继承了父类的属性和方法之后,我们还能不能在子类中调用父类中的方法或者属性呢;有,子类调用父类的属性或者方法有两种实现方式:

  1. 通过父类名点的方式来调用父类

    • 父类名.成员属性

    • 父类名.成员方法(self)

  2. 使用super()函数

    • super().成员变量

    • super().父类方法( )

  3. 注意,我们只能在子类的内部调用父类的同名成员,子类的实体类对象调用的默认是调用子类复写的成员;

抽象类

Python中的抽象类是指不能被实例化的类,其作用是为子类提供接口和规范。具体来说,抽象类定义了一组方法名,但没有具体实现,而子类必须实现这些方法才能被实例化。

为什么会有抽象类呢?有时我们希望父类并不给出方法的具体实现时,具体实现给到子类让子类书写时,就会有抽象类,

- 父类知识缺点有哪些方法;
- 具体实现给子类自行决定;

案例:

class Animal:
	def speak(self):
		pass
	def eat(self):
		pass

class dog(Animal):
	def speak(self):
		print("hhhh")
class cat(Animal):
	def speak(self):
		print("mmmm")

课堂笔记: 

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

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

相关文章

自动构建之Makefile

链接: 自动构建之CMake Makefile Makefile是用于自动化构建软件项目的工具,Makefile的优点是简单、直接,可以直接使用make工具进行构建。但是,Makefile通常需要手动编写和维护,可能会导致跨平台和跨编译器的兼容性问题。 Makef…

【SVN内网穿透】远程访问Linux SVN服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

.Net Core 数据校验框架使用

为了提高响应速度和界面可用性,一般在客户端都会对用户填写的数据进行校验,这样不需要把数据发送到服务端,用户就知道数据填写错误。但是也不能完全依赖客户端的校验,不仅因为恶意用户可以绕过客户端校验直接向服务器发送请求&…

YOLOv5区域检测+声音警报

YOLOv5区域检测声音警报 1. 相关配置2. 检测区域设置3. 画检测区域线(不想显示也可以不画)4. 报警模块5. 代码修改5.1 主代码5.2 细节修改(可忽略) 6. 实验效果 本篇博文工程源码下载 链接1:https://github.com/up-up-…

图片模块封装

图片模块封装 一.如何更换图片框架二.Glide配置1.依赖: 三.策略模式构建者模式图片框架搭建1.ImageOptions图片参数设置2.IImageLoader接口以及实现子类3.图片加载策略4.ImageLoader5.ImageLoaderManager6.使用:四.Bitmap三级缓存二次采样五.长图大图处理 一.如何更…

华为OD机试真题 Java 实现【任务混部】【2023Q1 200分】

一、题目描述 公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你帮他们解决一个任务混部问题: 有taskNum项任务,每个任务有开始时间(startTime ),结束时间(endTime…

Linux系统之cut命令的基本使用

Linux系统之cut命令的基本使用 一、cut命令介绍1. cut命令简介2.cut命令的由来 二、在Linux中命令帮助1. cut的help帮助信息2. cut的选项 三、cut的基本使用1. 指定字段的内容2. 使用分隔符打印文本内容3. 显示行中指定范围的字符 四、cut命令的日常使用1. 提取IP地址2. 提取本…

position:sticky-粘性吸附布局

一、描述 就是在一个滚动的容器里,将一个子元素设置为postion:sticky 在元素显示在可视区域内,显示的效果与position:relative 一致,当元素被滑动出可视区域外是,显示效果与position:fixed一致 二、注意事项 1、父元素需要存在滚动(overflow:auto&…

快速入门Springboot整合Datagpa操作数据库

简介SpringDatagpa Spring Data JPA是Spring Data家族的一部分,可以轻松实现基于JPA的存储库。 . JPA是ORM规范,Hibernate是JPA规范的具体实现,这样的好处是开发者可以面向JPA规范进行持久层的开发,而底层的实现则是可以切换的。S…

day5 套接字属性设置

选项的级别 SOL_SOCKET 该级别的选项只作用于套接字本身 SOL_LRLMP 该级别的选项作用于IrDA协议 IPPROTO_IP 该级别的选项作用于IPv4协议 IPPROTO_IPV6 该级别的选项作用于IPv6协议 IPPROTO_RM 该级别的选项作用于可靠的多播传输 IPPROTO_TCP 该级别的选项适用于流式…

信道通信基础 - 传输介质(双绞线、光纤)

文章目录 1 概述2 传输介质2.1 双绞线2.2 光纤 3 扩展3.1 网工软考真题 1 概述 2 传输介质 2.1 双绞线 双绞线:8 根铜导线每 2 根扭在一起(百兆用 4 根,千兆必须用 8 根)分类 2.2 光纤 光纤:利用光在 玻璃或塑料纤…

很长一段时间没有用Ubuntu,无法获得锁**,锁正由进程***持有

问题分析:意思就是有另一个进程占用了apt-get,因为Ubuntu锁的访问机制是互斥的,即同一时间只能允许一个进程占用,只需要将那个占用的进程强制删除掉就行了。 使用如下两条命令即可: sudo rm /var/lib/dpkg/lock-fron…

藏在大神们收藏夹里的实用工具类网站!

今天来给大家分享几个大神们推荐的,藏在收藏夹里的宝藏工具类网站 Toolfk https://www.toolfk.com/ 一款程序员的工具箱,里面包含非常多实用工具,不仅有各种程序相关功能,还有很多不懂程序人也能用的简易功能。PHP在线加密工具、…

docker-compose 搭建maven私服 nexus与配置

目录 创建文件目录 docker-compose.yml文件 登录 配置 创建阿里云代理仓库 配置仓库顺序 maven配置文件setting.xml配置 本地jar包部署 在linux上搭建 创建文件目录 mkdir -p /apps/minio/{config,data,logs} 赋权限 chmod -R 777 data docker-compose.yml文件 version…

按键中断实验和串口中断实验

目录 【1】按键中断实验 【2】串口中断实验 【1】按键中断实验 实验要求:STM32上电LED(PB0)灯灭 ,当检测到按键(PA8)按下时处理中断事件,变量i 扩展:知识点 响应优先级-》在两个中断…

Camtasia2023简体中文版屏幕录像 支持MP4/AVI/WMV等多种格式

在现在的网络互联网时代,越来越多的人走上了自媒体的道路。有些自媒体人会自己在网络上录制精彩视频,也有一些人会将精彩、热门的电影剪辑出来再加上自己给它的配音,做成大家喜欢看的电影剪辑片段。相信不管大家是自己平时有独特的爱好也好、…

TOGAF架构开发方法—ADM 架构需求管理

一、目标 需求管理阶段的目标是: 确保需求管理流程持续运行,并在所有相关的 ADM 阶段运行管理在 ADM 周期或阶段的任何执行期间确定的架构要求确保在执行阶段时,每个阶段都可以使用相关的体系结构要求 二、输入 需求管理阶段的输入包括&am…

Bean作用域、生命周期

bean作用域如何设置行为模式Bean的生命周期 bean作用域 Bean 的作用域指bean在spring框架的某种行为模式;bean的6种作用域分别是以下: 1:单例(Singleton)作用域 2:原型(Prototype)作…

chatgpt赋能Python-python_chardet

Python Chardet: 自动识别文件编码的利器 Python Chardet 是一个用于自动识别文件编码的工具,它基于最新的编码库,可以自动检测多种编码类型。在今天的多语言互联网时代,我们经常需要处理各种编码类型的文件,例如:爬虫…