Pyhton之深入理解类

深入理解Python中的类

简介

在Python中,类是实现面向对象编程(OOP)的主要工具。它们允许我们创建自定义的数据结构,它包含了数据和对数据操作的方法。本文将帮助你理解Python中类的工作原理,以及如何有效地使用它们。

类的基本概念

定义一个新式类

在Python中定义一个类使用关键字class

class Person(object):# 定义两个方法def eat(self,food):print('吃', food)def sleep(self,t):print('每天至少睡',t,'小时')

创建实例

要使用类,我们需要创建它的实例:

实例对象后,会在内存中分配一块空间,这个空间就是实例对象的位置

tom = Person()

实例多个对象

实例多个对象会在内存中分配不同的空间,然后将地址引用给对象名。

a = Person()
b = Person()
c = Person()print(a)
print(b)
print(c)'''
输出
<__main__.MyClass object at 0x000002D374234E80>
<__main__.MyClass object at 0x000002D3745783D0>
<__main__.MyClass object at 0x000002D37433A5E0>
'''

当我们创建一个类的实例时,__init__方法会被自动调用,接受我们传递的参数(在这个例子中是"我是一个实例属性")。

访问属性和方法

创建实例后,我们可以访问其属性和方法:

tom.eat('饭')
tom.eat('海鲜')
tom.sleep(8)
'''
输出
吃 饭
吃 海鲜
每天至少睡 8 小时
'''

私有属性和方法

私有属性

私有方法

继承

Python支持类的继承,允许我们创建新的类作为现有类的子类,继承其属性和方法,并可以添加新的属性和方法或覆盖现有的。

class SubClass(MyClass): """继承自MyClass的子类""" def method(self): """覆盖了MyClass中的方法""" return "调用了子类的方法" 

现在SubClass会继承MyClass的所有特性,但method方法已经被覆盖了。

多态性

多态性是OOP的一个核心概念,它允许我们编写可以与多种类型的对象一起工作的函数或方法,只要这些对象都有一个公共的接口(比如相同名称的方法)

def call_method(obj): return obj.method() 
# 即使是不同类型的对象,但是只要它们都有`method`方法,都可以使用 print(call_method(instance)) # 调用MyClass的实例 print(call_method(SubClass(42))) # 调用SubClass的实例

类和实例属性

类属性与实例属性之间有重要的区别。类属性是属于类的,被所有实例共享。而实例属性仅属于特定的实例。

class DemoClass: class_attr = 0 def __init__(self, value): self.instance_attr = value # 创建两个实例 a = DemoClass(1) b = DemoClass(2) # 修改类属性,会影响所有实例 DemoClass.class_attr = 5 print(a.class_attr) # 输出: 5 print(b.class_attr) # 输出: 5 # 修改实例属性,只影响那个特定的实例 a.instance_attr = 10 print(a.instance_attr) # 输出: 10     print(b.instance_attr) # 输出: 2 

魔法方法

在Python中,有许多内置的方法名有特殊的意义,这些方法名通常以双下划线(__)开始和结束。它们也被称为魔法方法或特殊方法。这些方法可以让我们重载或者定义对象的操作。

__init__() 方法:

在Python中,__init__方法是一个特殊的方法(有时称为‘魔法方法’),在创建类实例对象时被自动调用。

作用:

初始化实例的属性(起到一个传递参数的作用)

class Myclass(object):def __init__(self,value):self.my_attribute = valuedef my_method(self):return self.my_attribute# 创建一个类的实例
my_instance = MyClass(10)
# 调用实例的方法
print(my_instance.my_method())  # 输出: 10
__init__方法特点:

        1、__init__方法不是一个构造函数,它在类实例化对象后运行,用来初始化实例对象属性;

        2、第一个参数self是实例对象的引用,确保在方法内部访问实例对象的属性和其他方法

self 不是Python的关键字或强制性的,它只是一个按照惯例使用的变量名。你可以使用其他变量名,但强烈建议遵循这个约定,因为它对于其他Python程序员来说是最易读和理解的。

        3、__init__方法可以有任意数量的参数,这些参数在创建类实例对象时传入。

        4、__init__方法可以是空的,也可以不写但通常被用来设置实例的初始化状态(传参)。

        5、如果你有一个继承链,__init__ 方法需要调用基类的 __init__ 方法,以确保基类也被正确初始化。这可以通过使用 super() 函数实现。

__str__()方法

在Python中,__str__()方法是一个特殊的方法,用于定义一个对象的“正式”字符串表示,当你使用print()函数或str()函数将对象转换为字符串时,Python解释器会调用这个方法。它通常应该返回一个友好易读的字符串,让用户能够理解对象的状态。

作用:

格式化字符串

class Cat(object):def __init__(self,name, age, height):self.username = nameself.age = ageself.height = heightdef __str__(self):print('String Run ..',self.username)# print(self.username, self.age, self.height)s = f'姓名:{self.username}年龄:{self.age}身高:{self.height}'return s
tom = Cat('Tom',1,'50cm')
print(tom)
'''
输出
姓名:Tom年龄:1身高:50cm
'''
_str__()方法特点:

        1、_str__()方法必须有一个返回值而且返回值必须是字符串。

        2、如果需要将实例对象的信息按照一定的格式进行显示,可以在这里进行修饰。

        3、修饰完,可以将这个格式化字符串返回,让str()方法执行时,得到该对象转换后的字符串类型。   

__del__()方法

在Python中,__del__ 方法是一个特殊方法,它被称为析构器(destructor)。这个方法在对象即将被删除时被自动调用。通常情况下,这发生在Python的垃圾回收器决定从内存中删除一个对象时,或者当对象的引用计数降到0时。

__del__ 方法的主要用途是确保对象释放分配给它的资源。例如,如果对象持有文件、网络连接或数据库连接等资源,__del__ 方法可以确保这些资源在对象不再使用时被正确关闭。

class Cat(object):def __init__(self,name):self.name = namedef __del__(self):# 要在这个方法中将当前对象持有的其它对象手动销毁del self.nameprint('del run ...')
tom = Cat('tom')
# 执行下面的代码 时,会自动 调用  __del__ 方法,将这个对象销毁,回收对象内存资源
del tom
print('over')

结论

Python中的类是创建自定义数据结构的强大工具,它支持继承、多态性和封装等OOP特性。通过理解类如何工作,你可以写出更加模块化、可重用和易于维护的代码。记住,类应该简单而且一目了然,最好每个类只负责一件事情。掌握了Python中的类,将有助于你在面向对象编程的世界中进行更深入的探索。

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

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

相关文章

element input 选中 但值未及时回显

这可能是因为 Vue 的渲染更新机制。Vue 使用异步更新队列&#xff0c;当你观察到数据变化时&#xff0c;Vue 将开启一个队列&#xff0c;并缓冲在同一事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发&#xff0c;只会被推入到队列中一次。这种在缓冲时去除重复数…

C语言连接zookeeper客户端(不能完全参考官网教程)

准备过程 1.通过VStudio 远程连接linux的开发环境&#xff1b; 2.g环境&#xff0c;通过MingW安装&#xff1b; 3.必须要安装好pthread.h的环境&#xff0c;不管是windows端&#xff08;linux 可视化端开发就不管这个&#xff09;还是linux端&#xff1b; 4.需要准备zookeeper…

USB2.0 Spec

USB System Description A USB system is described by three definitional areas: • USB interconnect • USB devices • USB host USB interconnect The USB interconnect is the manner in which USB devices are connected to and communicate with the host. USB Ho…

docker基本命令

1.docker命令图解 2. 从仓库拉取镜像 #下载最新版 docker pull nginx # 镜像名:版本名&#xff08;标签&#xff09; docker pull nginx:1.20.1docker rmi 镜像名:版本号/镜像id3. 容器启动及停止 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] docker run [设置项] 镜…

maven阿里镜像华为镜像,settings.xml的mirrors

将下面这段放到settings.xml的settings标签下, mirrors标签只能有一个 <mirrors> <!-- 阿里开源镜像站maven网址 https://developer.aliyun.com/mirror/maven--><mirror><id>aliyunMavenRepositoryPublic</id><name>阿里云公共仓库2…

Flink系列之:窗口聚合

Flink系列之&#xff1a;窗口聚合 一、窗口表值函数&#xff08;TVF&#xff09;聚合二、窗口表值函数TVF三、分组集四、ROLLUP五、CUBE六、选择组窗口开始和结束时间戳七、多级窗口聚合八、分组窗口聚合九、时间属性十、选取分组窗口开始和结束时间戳 一、窗口表值函数&#x…

Linux常用命令大全(摘录整理)

1、ls命令2、cd命令3、pwd命令4、mkdir命令5、rm命令6、rmdir命令7、mv命令8、cp命令9、cat命令10、more命令11、less命令12、head命令13、tail命令14、which命令15、whereis命令16、locate命令17、find命令18、chmod命令19、tar命令20、chown命令21、df命令22、du命令23、ln命…

R语言【rgbif】——occ_search对待字符长度大于1500的WKT的特殊处理真的有必要吗?

一句话结论&#xff1a;只要有网有流量&#xff0c;直接用长WKT传递给参数【geometry】、参数【limit】配合参数【start】获取所有记录。 当我在阅读 【rgbif】 给出的用户手册时&#xff0c;注意到 【occ_search】 强调了 参数 【geometry】使用的wkt格式字符串长度。 文中如…

Linux内存管理(十七):percpu 分配器——框架实现

源码基于:Linux5.4 约定: 芯片架构:ARM64内存架构:UMACONFIG_ARM64_VA_BITS:39CONFIG_ARM64_PAGE_SHIFT:12CONFIG_PGTABLE_LEVELS :3关联博文: percpu分配器——基础概念 percpu分配器——框架实现 percpu分配器——动态分配 0. 前言 上一篇博文</

使用数组模拟栈的相关操作【栈1.1】

public class ArrayStackDemo {public static void main(String[] args) {ArrayStack arrayStack new ArrayStack(4);Scanner sc new Scanner(System.in);boolean loop true;char key ;while (loop) {System.out.println("栈操作菜单项");System.out.println(&q…

基于SpringBoot和微信小程序网上购物商城

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot和微信小程序网上购物商城…

范仲淹仅存五首词作,篇篇经典

范仲淹&#xff0c;北宋时期杰出的政治家&#xff0c;文学家&#xff0c;提起他首先想到初中那篇《岳阳楼记》&#xff0c;难倒无数背诵困难户&#xff0c;它虽然难背&#xff0c;但却是一篇文字排列极美&#xff0c;意境极佳的美文。 “不以物喜&#xff0c;不以己悲&#xf…

Android hilt使用

一&#xff0c;添加依赖库 添加依赖库app build.gradle.kts implementation("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-compiler:2.49"…

Python顶级组件

顶级组件 Python 解释器可以从多种源获得输入&#xff1a;作为标准输入或程序参数传入的脚本&#xff0c;以交互方式键入的语句&#xff0c;导入的模块源文件等等。 这一章将给出在这些情况下所用的语法。 9.1. 完整的 Python 程序 虽然语言规范描述不必规定如何发起调用语言…

【leetcode刷题之MySQL】

175. 组合两个表 select firstName,lastName,city, state from Person left join Address on Person.personIdAddress.personId LEFT JOIN&#xff1a;保留左表内容&#xff0c;右表不存在的列使用 Null 代替 RIGHT JOIN&#xff1a;保留右表中连接字段的内容&#xff0c;左表…

【ubuntu】Linux常用截屏软件

Linux截屏软件及安装教程 截屏软件简介 在Linux系统中&#xff0c;有多种强大的截屏工具可供选择。以下是一些常用的截屏软件&#xff1a; Shutter 功能强大&#xff0c;支持全屏、窗口、选区等多种截屏方式。可以添加注释、标记和编辑截图。 Flameshot 轻量级截屏工具&…

程序人生,由“小作文”事件想到的

时势造英雄。自媒体时代&#xff0c;火出圈是靠大众的审美和爱好&#xff0c;自己能做的关键&#xff0c;其实是做好自己&#xff0c;选择向上生长&#xff0c;持续不断的读书、学习。同时保持一份好奇心&#xff0c;培养一个兴趣爱好并自得其乐。 展示自我 回想起我小时候&am…

Linux内核实现AES加密

本文涉及到编写一个内核模块&#xff0c;扩展内核密钥类型并使用该密钥实现AES加密。以下是一个简单的示例代码&#xff0c;演示如何在C语言中实现一个内核模块以及在内核中使用密钥进行AES加密。 c #include <linux/module.h> #include <linux/kernel.h> #includ…

Promise执行顺序

小编建议小伙伴们不要跳点看&#xff0c;每一点都是衔接&#xff0c;有比较的 本篇文章考查 ①promise是同步任务还是微任务 ②promise.then()什么时候执行&#xff0c;是微任务还是宏任务 ③如何控制状态变化&#xff0c;不同状态变化&#xff0c;会执行哪个回调函数 1、以下代…

进制之间的转换——n进制转换为m进制(C/C++实现,简单易懂)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 什么是进制转换&#xff1a; &#x1f4c1;其他进制转换成十进制&#xff1a; &#x1f4c2;二进制( B ) ——> 十进制( D ) &#x1f4c2;八进制( O ) ——> 十进制( D ) &#x1f4c2;十六进制( H ) ——> 十进制…