Python进阶-----面对对象6.0(绑定方法[类方法、静态方法]与内置方法)

news2024/10/5 8:16:00

 

目录

前言:

1.绑定方法

(1)实例方法

(2)类方法

 (3)静态方法

2.类型检测

(1)issubclass() 函数

(2)isinstance() 函数

3.内置方法(魔法方法)

(1)信息格式化(__str__())

(2)析构方法(__del__())

(3)空间分配(__new__())


前言:

        前面已经学习了Python中的三大特征:封装、继承、多态。核心内容基本上也说完了,那今天这一期主要是讲讲Python中一些语法方法,包括绑定方法(示例方法,类方法,静态方法)和内置方法,好了废话不多说,上正题。

1.绑定方法

(1)实例方法

前面我们已经讲过了实例方法,也就是在类里面定义方法的时候会带有一个self实例参数,当我们去使用实例方法的时候,实例参数会传入给self进行调用,然后去实现相关功能

class A(object):
    def __init__(self,name,age):
        self.name=name
        self.__age=age
    def fun(self): #定义的实例方法
        return self.__age
user=A('小敏',18)
print(user.fun())
#输出结果:18

实例方法前面已经讲过了,这里就不多说了

(2)类方法

概念

类方法:顾名思义就是通过类去调用的方法, 用装饰器@classmethod进行装饰,类方法可以类在多次实例化后有个记忆的功能。类方法操作的是类属性,因为类方法无法通过self去查找对象的实例属性

当我们去通过装饰器@classmethod 去装饰一个方法的时候,这个方法就会被定义为类方法,然后会自动带有cls参数,这个参数就是类参数 

 调用规则:

类方法的调用不一定需要实例化对象才可以调用,可以通过类去直接使用:类.类方法()  ,当然也可以去通过实例对象去调用都是没问题的

 看个例子:

class B(object):
    def __init__(self,name):
        self.name=name
    @classmethod
    def fun(cls):
        print('这是一个类方法')
B.fun()
#输出结果:这是一个类方法
user=B('jk')
user.fun()
#输出结果:这是一个类方法

这里我们可以看到,当去调用类方法的时候不需要实例化对象就可以去调用(实例化对象也可以调用) 

 再看个例子,类方法虽然不可以操作实例属性,但是可以去操作类属性的:

class A(object):
    count=0 #定义的类属性
    def __init__(self,name):
        self.name=name
        A.classway() #调用类方法
        self.fun()
    @classmethod
    def classway(cls):
        cls.count+=1 #类方法可以去操作类属性,但是不能操作实例属性(self)
        #统计次数
    def fun(self):
        print(f'调用了第{self.count}次')
for i in range(4):
    t=A('jb')
#输出结果:
# 调用了第1次
# 调用了第2次
# 调用了第3次
# 调用了第4次

注意:

  • 类无法调用实例方法

  • 实例对象可以调用类方法

  • 区别在于:类方法不用实例化对象,只用类就可以调用

 总的来说就是实例对象既可以调用实例方法/实例属性,也可以调用类方法/属性;而类对象只能调用类方法/类属性,不能调用实例方法/属性

 (3)静态方法

概念:

静态方法:通过装饰器@staticmethod进行修饰,没有cls,self参数,没有任何绑定

 性质和作用

  • 静态方法就是相当于定义在类外面的函数,只是为了方便管理常用的方法(函数),放在类中,统一管理

  • 静态方法 不访问类成员(类方法,类属性),实例成员(实例属性,实例方法)

  • 用于:定义常用的工具函数

class Student(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def fun(self):
        print('学生')
def study():
    print('学习知识')
dick=Student('dick',18)
dick.study=study
dick.study()
#输出:学习知识

通过上面这个示例,我们很容易看出study() 这个方法是在外部添加给实例对象dick,其实这就是静态方法的实质,区别不同的是静态方法是放到类对象的内部的。

示例:静态方法的定义

import time
class Student(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def fun(self):
        print('学生')
    @staticmethod
    def study():
        print(time.asctime(time.localtime()),'dk刷了一道题')
dick=Student('dick',18)
dick.study()
#输出:Sat Mar  4 20:22:01 2023 dk刷了一道题
Student.study()
#输出:Sat Mar  4 20:22:26 2023 dk刷了一道题

注意:

静态方法是不绑定类对象(cls)和实例对象(self)的,所以既可以通过实例对象去调用,也可以通过类对象去调用

2.类型检测

在此之前我们学过了以类型检测的方法type() 函数,这个函数可以检测变量类型的

a=15
b=False
print(type(a),type(b))
#输出结果:<class 'int'> <class 'bool'>

(1)issubclass() 函数

语法格式:issubclass(son,dad……)

参数说明:son 是表示子类,dad是表示父类,父类可以是多个(多继承)

作用:这个函数可以检测子类(son)与父类(dad)是否有继承关系,返回布尔变量(True,False)

class A(object):
    pass
class B(A):
    pass
print(issubclass(B,A))
#输出结果:True

(2)isinstance() 函数

语法格式:isinstance(obj, cls)

参数说明:obj 是表示实例化对象,cls是表示类对象,

作用:判断一个实例化对象是不是由某一个类对象而来的

class A(object):
    pass
a=A()
print(isinstance(a,A))
#输出结果:True

3.内置方法(魔法方法)

 我们可以去通过dir() 直接查找一个类具有的方法,所以我们直接dir(object)去查看类中的内置方法

print(dir(object))
# ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
#  '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
#  '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

(1)信息格式化(__str__())

在一般情况下,我们输出一个实例对象,结果是这个对象的地址,其实这个是一个类对象对实例对象默认的描述,但是我们也可以去通过类中的内置方法去修改实例对象的描述

方法:

__str__() 该方法用户可以直接通过打印对象名字来获取对象的自定义描述,而不是对应的内存地址

__repr__()该方法是返回对象的自定义描述,是在交互模式下进行使用

返回值:字符串(只能是字符串)

对比两个示例: 

class A(object):
    def __init__(self,name):
        self.name=name
a=A('dick')
print(a)
#输出结果:<__main__.A object at 0x00000224910E17C0>
class A(object):
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return '我是dick'
a=A('dick')
print(a)
#输出结果:我是dick

注意如果__str__()与__repr__() 同时出现的时候,类的描述返回值是选择执行__str__()的,因为__repr__()一般是在交互模式下所以的,脚本模式优先使用__str__()方法

class A(object):
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return 'str方法'
    def __repr__(self):
        return 'repe方法'
a=A('dick')
print(a)
#输出结果:str方法

(2)析构方法(__del__())

__del__() 当检测到对象要被删掉时,就会触发它 ,然后执行这个方法的内容(比如说玩王者荣耀时,英雄阵亡时会触发阵亡语句)

示例:

class Daji(object):
    def __init__(self):
        self.name='妲己'
    def __del__(self): #检测实例对象是否被删除
        print('被玩坏了') #如果实例对象被删除了,就执行
hero=Daji()
del hero
# 输出结果:被玩坏了

(3)空间分配(__new__())

        当我们去创建一个新的对象的时候,要对这个对象进行空间分配,前面我们讲过object类是所有类中的父类(众神之父),都继承与object类,其中object类是有一个__new__() 方法的,当我们给类对象分配空间的时候会触发__new__()方法,然后得到一个实例化的引索值(实例对象),最后通过__init__() 方法对这个引索值初始化,所有当我们去创建一个实例的时候会执行__new__() 和__init__()方法

 所有类都是继承object类,当我们对一个新的类进行def 方法写入,其实都是重写object类

__new__ (cls)

作用:内置的静态类方法,主要是给实例对象分配内存空间

 例子:

class A(object):#继承object类
    def __new__(cls, *args, **kwargs): #重写new方法
        print('new function')
        res=object.__new__(cls)
        return res #返回分配好对象的空间
    def __init__(self,name): #会把new方法返回的对象传入到self,然后初始化
        print('初始化方法')
        self.name=name
a=A('dick')
print(a.name)
#输出结果:
# new function
# 初始化方法
# dick

好了,这一期就先到这里了,我们下一期再见~~~

下一期会进一步详细讲解new方法和init方法

分享一张壁纸:

 

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

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

相关文章

【Verilog】——赋值语句、结构语句、块语句

目录 1.常用语句 2.块语句 1.顺序块 2.并行块 ​ 3.结构语句 1.always 2.initial 4.赋值语句 1.非阻塞赋值 2.阻塞赋值 3.非阻塞赋值和阻塞赋值的区别 4.深入理解阻塞赋值和非阻塞赋值 声明信号的时候统一大数在高位&#xff0c;小数在低位 比如&#xff1a;reg [3:…

多线程篇之8锁问题、字节码看Synchronized

八锁问题 ①. 标准访问有ab两个线程,请问先打印邮件还是短信 ②. sendEmail方法暂停3秒钟,请问先打印邮件还是短信 ③. 新增一个普通的hello方法,请问先打印邮件还是hello ④. 有两部手机,请问先打印邮件还是短信 ⑤. 两个静态同步方法,同1部手机,请问先打印邮件还是短信 ⑥. …

【数据库系列】MQSQL历史数据分区

互联网行业企业都倾向于mysql数据库&#xff0c;虽说mysql单表能支持亿级别的数据量&#xff0c;加上索引优化下查询速度&#xff0c;勉强能使用&#xff0c;但是对于追求性能和效率的互联网企业&#xff0c;这是远远不够的。Mysql数据库单表数据量到达500万左右&#xff0c;达…

第四讲:如何将本地代码与服务器代码保持实时同步

一、前言 在我们进行 Ambari 二次开发时,通常会先在服务器上部署一套可以使用的 Ambari 环境。 二次开发,就肯定是要改动代码的,我们不能老是在服务器上用vim编辑文件,那样效率太低,始终不是长久之计。 所以我们需要在本地打开我们的Ambari源码项目,比如用idea工具,可…

【电子学会】2022年12月图形化二级 -- 绘制风车

绘制风车 1. 准备工作 &#xff08;1&#xff09;隐藏默认的小猫角色&#xff1b; &#xff08;2&#xff09;选择背景&#xff1a;“Xy-grid”。 2. 功能实现 &#xff08;1&#xff09;小猫角色的初始位置为(x:0,y:0)&#xff1b; &#xff08;2&#xff09;线条粗细为…

实验4 设计模式实验3

实验内容: 1. 某软件公司为新开发的智能手机控制与管理软件提供了一键备份功能,通 过该功能可以将原本存储在手机中的通信录、短信、照片、歌曲等资料一次性全 部拷贝到移动存储介质(例如MMC 卡或SD 卡)中。在实现过程中需要与多个 已有的类进行交互,例如通讯录管理类、短信…

黑马Spring学习笔记(四)——面向切面编程AOP

目录 一、AOP简介 二、AOP核心概念 三、AOP入门案例 四、AOP配置管理 4.1 AOP切入点表达式 4.1.1 语法格式 4.2.2 通配符 4.2.3 书写技巧 4.2 AOP通知类型 4.2.1 前置、后置、返回后、抛出异常后获取参数 4.2.2 环绕通知 一、AOP简介 AOP(Aspect Oriented Pro…

【IoT】创业成功不可或缺的两个因素:能力和趋势

今天就来谈谈能力和趋势究竟哪个更重要的问题。 在谈成功的十大要素时&#xff0c;我曾经讲到&#xff1a; 一命、二运、三风水&#xff0c;这三个要素几乎不涉及任何个人的努力。 而趋势跟这三个要素又是息息相关的&#xff0c;这也类似雷军所说的飞猪理论。 只要风足够大&…

Centos7(阿里云)_安装Mysql8.0

1.安装MySQL 新人可以试用一个月的阿里云&#xff0c;centos7的 一开始可能确实会自带mariadb&#xff0c;所以可以在网上随便找个教程开始尝试安装MySQL&#xff0c;当然大概率出错&#xff0c;然后此时你的rpm下面已经有了一个版本的mysql安装包。 以我为例&#xff0c;随便…

Windows下jdk安装与卸载-超详细的图文教程

jdk安装 下载jdk 由于现在主流就是jdk1.8&#xff0c;所以这里就下载jdk1.8进行演示。官方下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows。 官方下载需要注册oracle账号&#xff0c;国内下载有可能速度慢&#xff0c;若不想注册账…

【Linux】P5 实用快捷键 以及 下载安装指令

Linux实用快捷键与下载安装实用快捷键强制停止退出账户 / 环境查看历史命令光标移动快捷键清屏下载安装命令CentOS - yumUbunto - apt实用快捷键 强制停止 CTRL C当程序陷入死循环或者执行错误&#xff0c;可通过该命令强制停止 当程序输入很长但是发现错误&#xff0c;不想…

PDF 解析格式化输出 API 数据接口

PDF 解析格式化输出 API 数据接口 支持输出 TEXT HTML XML TAG&#xff0c;多种格式输出&#xff0c;超精准识别率。 1. 产品功能 通用的识别接口&#xff0c; 支持标准 PDF 文件解析&#xff1b;多种格式输出&#xff0c;支持 TEXT HTML XML TAG&#xff1b;HTML 包含完美排…

蒙特卡洛树搜索(MTCS)

一、目标 一种启发式的搜索算法&#xff0c;在搜索空间巨大的场景下比较有效 算法完成后得到一棵树&#xff0c;这棵树可以实现&#xff1a;给定一个游戏状态&#xff0c;直接选择最佳的下一步 二、算法四阶段 1、选择&#xff08;Selection&#xff09; 父节点选择UCB值最…

【ONE·C || 文件操作】

总言 C语言&#xff1a;文件操作。    文章目录总言1、文件是什么&#xff1f;为什么需要文件&#xff1f;1.1、为什么需要文件&#xff1f;1.2、文件是什么&#xff1f;2、文件的打开与关闭2.1、文件指针2.2、文件打开和关闭&#xff1a;fopen、fclose2.3、文件使用方式3、文…

windows下go安装并使用protobuf

go使用protobuf的过程以及可能出现的问题1. 下载proto windows版本并安装2. 安装protoc-gen-go3. proto文件转go文件报错protoc-gen-go: unable to determine go import path for "xxxx.proto"4. 生成的go文件中google.golang.org/protobuf/reflect/protoreflect依赖…

Zookeeper3.5.7版本——客户端命令行操作(znode 节点数据信息)

目录一、命令行语法二、znode 节点数据信息2.1、查看当前znode中所包含的内容2.2、查看当前节点详细数据2.3、节点详细数据解释一、命令行语法 命令行语法列表 命令基本语法功能描述help显示所有操作命令ls path使用 ls 命令来查看当前 znode 的子节点 [可监听]-w 监听子节点变…

粒子群优化最小二乘支持向量机SVM回归分析,pso-lssvm回归预测

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 SVM应用实例,粒子群优化最小二乘支持向量机SVM回归分析 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大…

视觉SLAM十四讲ch6 非线性优化笔记

视觉SLAM十四讲ch6 非线性优化笔记本讲目标上讲回顾状态估计问题非线性最小二乘Gauss-Newton&#xff1a;高斯牛顿Levenburg-Marquadt&#xff1a;列文伯格-马夸尔特小结实践&#xff1a;CERES实践&#xff1a;G2O本讲目标 理解最小二乘法的含义和处理方式。 理解Gauss-Newton…

CopyOnWriteArrayList 源码解读

一、CopyOnWriteArrayList 源码解读 在 JUC 中&#xff0c;对于 ArrayList 的线程安全用法&#xff0c;比较推崇于使用 CopyOnWriteArrayList &#xff0c;那 CopyOnWriteArrayList是怎么解决线程安全问题的呢&#xff0c;本文带领大家一起解读下 CopyOnWriteArrayList 的源码…

Day908.joinsnljdist和group问题和备库自增主键问题 -MySQL实战

join&snlj&dist和group问题和备库自增主键问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于join&snlj&dist和group问题和备库自增主键问题的内容。 一、join 的写法 join 语句怎么优化&#xff1f;中&#xff0c;在介绍 join 执行顺序的时候&am…