Python面向对象基础与魔法方法详解

简介: Python面向对象基础与魔法方法详解

前言

本文主要介绍了面向对象的基础内容(类与对象)和一些常见的魔法方法。下一篇:面向对象进阶(继承、封装、多态)点这!!!

一、面向对象

面向对象和面向过程

面向对象和面向过程都是解决问题的一种思路,一种方式

# 吃火锅

# 第一种方式:在家吃   --- 面向过程    
买菜-->洗菜-->摆盘-->下菜-->吃-->洗锅-->扔垃圾

# 第二种方式:去店里吃   ---  面向对象
扫码-->吃

# 面向对象建立在面向过程的基础上
1、面向对象就是:把数据和对数据的操作封装在一起组成类,通过类来创建对象,通过对象之间的交互来实现程序的功能。
2、面向对象落地需要使用 “类” 和 “对象” 

优缺点

面向对象:核心就是对象,上帝式思维
  优点:上帝眼里万物皆存在,代码效率高
  缺点:无法及时准确的发现问题并解决

面向过程:核心就是过程,流水线式思维
  优点:过程中及时发现并解决问题
  缺点:大量的代码堆叠只为了实现一个简单的功能,过程中出现问题,接下来的操作无法正常执行

二、类与对象

类与对象的区别:类就是创建对象的模板

1.类

1.1 类的介绍

人类    将具有共同特征和行为的事物进行抽象,抽象出一个类
对象    类中具体的一个实例-->张三  李四  王五

类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在。一个类可以找到多个对象

1.2 类的构成

类(Class) 由3个部分构成

- 类的名称:类名
- 类的属性:一组数据
- 类的方法:类提供的可以进行一定操作的方法 (行为)

特征即属性(数据)
行为即方法(对数据的操作)


人类设计,只关心3样东西:

- 事物名称(类名):人(Person)
- 属性:身高(height)、年龄(age)
- 方法(行为/功能):跑(run)、打架(fight)

1.3 类的抽象

方法:一般名词都是类(名词提炼法)

**<1> 坦克发射3颗炮弹轰掉了2架飞机**

- 坦克--》可以抽象成 类
- 炮弹--》可以抽象成类
- 飞机-》可以抽象成类

1.4 类的定义

# 定义类
# 语法格式:
# class 类名(要继承的父类):
#     属性
#     方法

# 1.类名首字母大写,推荐使用大驼峰命名法(每一个单词首字母都大写,其余字母都小写)
# 2.要继承的父类可有可无,如果没有要继承的父类,类名后的()可以省略
# 3.object是所有类的顶级父类

# 根据是否继承object对类进行区分
# python2:
    # 新式类:继承了object类
    # 经典类:也称之为旧式类,没有object类
# python3:
    # 没有经典类与新式类区分,所有的类都是新式类;
class Person(object):
class Person():
class Person:
    pass

1.5 定义实例方法

# 定义英雄类
class Hero:

    # 在类中编写方法-->以函数的形式编写方法
    # self-->实例对象本身
    # 编写的方法称之为:实例方法
    def run(self):
        print("会跑")

2.对象

2.1 对象的介绍

某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。可以是直接使用的。

2.2 对象的定义

# 让实例对象调用实例方法     对象名.方法名()
luban.run()
anqila.run()

2.3 对象调用方法

# 让实例对象调用实例方法     对象名.方法名()
luban.run()
anqila.run()

2.4 给对象增加属性并获取

# 给实例对象增加实例属性    对象名.属性名 = 属性值
luban.name = "鲁班"
luban.gender = "男"
luban.age = 6
anqila.name = "安其拉"
anqila.gender = "女"
anqila.age = 10

# 获取实例对象的实例属性     print(对象名.属性名)
print(luban.age)
print(anqila.gender)

2.5 在实例方法中使用实例属性

# 定义英雄类
class Hero:
    def info(self):
        # 想要在实例方法中使用实例属性   self.属性名
        # self--》实例对象本身
        # 如果luban对象调用info方法,self-->luban
        # 如果anqila对象调用info方法,self-->anqila
        print(f"这个英雄的姓名是{self.name},年龄是{self.age},性别为{self.gender}")

三、魔法方法

概念

魔法方法:

表象:以__开头__结尾的方法称之为魔法方法

本质:不需要手动调用,会在特定的情况下自动被调用

_ init _()

# 定义一个鱼类  Fish
class Fish:
    # 魔法方法__init__:初始化方法
    # 作用:给实例对象增加实例属性
    # 调用:对象一旦创建成功会立马调用init
    # init方法的实参需要在 类名(实参) 的时候传递
    def __init__(self,name,price,weight):
        # 一个类有多个对象,想要给对象设置属性,不能直接写对象名,使用self代替
        # 每一个对象的属性值都不固定,属性值不能直接写死,通过传参的形式指定
        # 设置实例属性   对象名.属性名 = 属性值
        self.name = name
        self.price = price
        self.weight = weight

    # 类中定义方法:计算鱼的总价  "当前这个xxx鱼,xxx元一斤,xxx斤总共需要花费xxx元"
    # 实例方法-->以函数的形式定义
    # self--》实例对象本身
    def info(self):
        # 在实例方法中使用实例属性   self.属性名
        print(f"当前这个{self.name},{self.price}元一斤,{self.weight}斤总共需要花费{self.price * self.weight}元")


# 实例化两条鱼   鲤鱼 鲫鱼……     对象名 = 类名()
liyu = Fish("鲤鱼",5.6,9)
jiyu = Fish("鲫鱼",4,7)

# 实例对象调用实例方法  对象名.方法名()
liyu.info()
jiyu.info()

_ new _()

# 定义一个鱼类  Fish
class Fish:
    # 魔法方法__init__:初始化方法
    # 作用:给实例对象增加实例属性
    # 调用:对象一旦创建成功会立马调用init
    # init方法的实参需要在 类名(实参) 的时候传递
    def __init__(self,name,price,weight):
        # 一个类有多个对象,想要给对象设置属性,不能直接写对象名,使用self代替
        # 每一个对象的属性值都不固定,属性值不能直接写死,通过传参的形式指定
        # 设置实例属性   对象名.属性名 = 属性值
        self.name = name
        self.price = price
        self.weight = weight
        print("这是我的init方法")

    # 魔法方法__new__
    # cls-->类对象本身
    # 结论:new在init前被执行
    # 作用:创建对象
    # 调用:在实例化对象的时候被调用
    def __new__(cls, *args, **kwargs):
        # __new__方法必须至少有cls参数
        # 在自己实现__new__方法时注意:new的功能:返回父类__new__出来的实例
        # 没有自己继承的父类,可以使用顶级父类object
        print("这是我的new方法")
        return object.__new__(cls)

# 实例化两条鱼   鲤鱼 鲫鱼……     对象名 = 类名()
liyu = Fish("鲤鱼",5.6,9)
jiyu = Fish("鲫鱼",4,7)


# 注意:
1.后续编写类的时候不需要重写new方法,new方法在底层编写好了
2.当前这个案例编写new,为了理解new鱼init区别,谁先执行谁后执行,研究功能
3.new功能:只有返回父类__new__出来的实例,才能将对象创建成功(给对象开辟内存空间)
4.先执行__new__再执行__init__
5.单例模式、工厂模式需要重写new方法


`__new__`至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
`__new__`必须要有返回值,返回实例化出来的实例,这点在自己实现`__new__`时要特别注意,可以return父类`__new__`出来的实例,或者直接是object的`__new__`出来的实例
`__init__`有一个参数self,就是这个`__new__`返回的实例,`__init__`在`__new__`的基础上可以完成一些其它初始化的动作,`__init__`不需要返回值
我们可以将类比作制造商,`__new__`方法就是前期的原材料购买环节,`__init__`方法就是在有原材料的基础上,加工,初始化商品环节

_ str _()

# 定义一个鱼类  Fish
class Fish:
    # 魔法方法__init__:初始化方法
    # 作用:给实例对象增加实例属性
    # 调用:对象一旦创建成功会立马调用init
    # init方法的实参需要在 类名(实参) 的时候传递
    def __init__(self,name,price,weight):
        # 一个类有多个对象,想要给对象设置属性,不能直接写对象名,使用self代替
        # 每一个对象的属性值都不固定,属性值不能直接写死,通过传参的形式指定
        # 设置实例属性   对象名.属性名 = 属性值
        self.name = name
        self.price = price
        self.weight = weight
        print("这是我的init方法")

    # 魔法方法__str__
    # 调用:print(对象)
    # 功能:返回一个字符串
    # 作用:返回对象的描述信息
    
    def __str__(self):
        return f"当前这个{self.name},{self.price}元一斤,{self.weight}斤总共需要花费{self.price * self.weight}元"


# 实例化两条鱼   鲤鱼 鲫鱼……     对象名 = 类名()
liyu = Fish("鲤鱼",5.6,9)
jiyu = Fish("鲫鱼",4,7)

# 打印对象
# 如果不重写str方法,打印对象时会得到对象的内存地址
print(liyu)
print(jiyu)

_ del _()

# 定义一个鱼类  Fish
class Fish:

    # 魔法方法__del__
    # 调用:当对象要被删除时调用
    def __del__(self):
        print(f"{self.name}被删除")


# 实例化两条鱼   鲤鱼 鲫鱼……     对象名 = 类名()
liyu = Fish()
del liyu   # 删除对象前调用del
jiyu = Fish()

# 对象及类中没有再需要使用对象的地方了-->对象无用-->触发垃圾回收机制-->对象会被作为垃圾进行销毁
# 对象在被真正删除之前调用del
相关文章
|
2月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
241 1
|
3月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
|
3月前
|
调度 Python
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
微电网两阶段鲁棒优化经济调度方法(Python代码实现)
|
3月前
|
传感器 大数据 API
Python数字限制在指定范围内:方法与实践
在Python编程中,限制数字范围是常见需求,如游戏属性控制、金融计算和数据过滤等场景。本文介绍了五种主流方法:基础条件判断、数学运算、装饰器模式、类封装及NumPy数组处理,分别适用于不同复杂度和性能要求的场景。每种方法均有示例代码和适用情况说明,帮助开发者根据实际需求选择最优方案。
146 0
|
3月前
|
Python
Python字符串center()方法详解 - 实现字符串居中对齐的完整指南
Python的`center()`方法用于将字符串居中,并通过指定宽度和填充字符美化输出格式,常用于文本对齐、标题及表格设计。
|
2月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
298 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
4月前
|
安全 Python
Python语言中常用的文件操作方法探讨
通过上述方法的结合使用,我们可以构筑出强大并且可靠的文件操作逻辑,切实解决日常编程中遇到的文件处理问题。
197 72
|
2月前
|
算法 调度 决策智能
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
|
3月前
|
机器学习/深度学习 数据采集 算法
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Python&matlab代码实现)
192 4
|
5月前
|
存储 机器学习/深度学习 人工智能
稀疏矩阵存储模型比较与在Python中的实现方法探讨
本文探讨了稀疏矩阵的压缩存储模型及其在Python中的实现方法,涵盖COO、CSR、CSC等常见格式。通过`scipy.sparse`等工具,分析了稀疏矩阵在高效运算中的应用,如矩阵乘法和图结构分析。文章还结合实际场景(推荐系统、自然语言处理等),提供了优化建议及性能评估,并展望了稀疏计算与AI硬件协同的未来趋势。掌握稀疏矩阵技术,可显著提升大规模数据处理效率,为工程实践带来重要价值。
217 58

推荐镜像

更多