[Python学习日记-68] 绑定方法与非绑定方法

[Python学习日记-68] 绑定方法与非绑定方法

简介

绑定方法

非绑定方法

绑定方法与非绑定方法的应用

简介

        在之前我们学习类与对象的属性查找与绑定方法的时候就接触过绑定方法了,不过当时是简单的介绍了针对于对象的绑定方法,其实在类内部定义的函数分为两大类:绑定方法(bound method)和非绑定方法(unbound method),下面我们来展开介绍一下。

绑定方法

        绑定方法是与特定对象关联的方法。当调用一个绑定方法时,该方法会自动将该对象作为第一个参数(这个参数通常被称为 self)传递给方法,从而让绑定方法可以访问和修改对象的属性。简单来说就是绑定给谁就应该由谁来调用,并且谁来调用就会把调用者当作第一个参数自动传入。

        而绑定方法又分为两类:绑定到对象的方法和绑定到类的方法。

一、绑定到对象的方法

        绑定到对象的方法是我们最常见的绑定方法,在类当中没有被任何装饰器装饰的方法就是绑定到对象的方法,它有以下特点:

  • 为对象量身定制
  • 执行对象 .boud_method() 时,自动将对象当作第一个参数传入
  • 属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说

二、绑定到类的方法

        绑定到类的方法这个我们并没有接触过,在类当中用 @classmethod 装饰器装饰的方法就是绑定到类的方法,它有以下特点:

  • 为类量身定制
  • 执行类 .boud_method() 时,自动将类当作第一个参数传入
  • 绑定方法其实对象也可调用,但仍将类当作第一个参数传入

        绑定到类的方法就是专门给类用的,但其实对象也可以调用,只不过自动传入的第一个参数仍然是类,也就是说这种调用是没有意义的,并且容易引起混淆,这也是 Python 的对象系统与其他面向对象语言对象系统的区别之一,例如 Smalltalk 和 Ruby 中,绑定到类的方法与绑定到对象的方法是严格区分开的。 

非绑定方法

        非绑定方法是与类关联的方法。它们不会自动接收一个对象作为参数,因此无法直接访问和修改对象的属性。这个在之前也没有接触过,在类中用 @staticmethod 装饰器装饰的方法就是非绑定方法,它不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说,即需要手动传递一个对象作为参数。就是一个普通工具而已。

        需要注意与绑定到对象的方法区分开来,绑定到对象的方法是最简单的,无须任何装饰器装饰的,但是它可不是普通的函数,对象调用时该方法可是会自动传值的,而非绑定方法则是不管谁来调用都没有自动传值这一说。

绑定方法与非绑定方法的应用

        在前面了解完了绑定方法与非绑定方法的分类和特点之后,我们来看看到底应该怎么用,我们先建立一个 settings.py 来存储一些关于对象的设置参数,如下

# settings.py
# 存储的都是对象实例化时 __init__ 所需的参数
name = 'jove'
age = 18
sex = 'male'

        下面来编写类,如下

import settings
import hashlib
import time


class People:
    def __init__(self, name, age, sex):
        self.id = self.create_id()
        self.name = name
        self.age = age
        self.sex = sex

    # 采用那种方法一定是根据函数体的逻辑来决定的
    # 绑定到对象的方法
    def tell_info(self):
        print('Name:%s Age:%s Sex:%s' % (self.name, self.age, self.sex))

    # 绑定到类的方法
    @classmethod
    def from_conf(cls):
        obj = cls(
            settings.name,
            settings.age,
            settings.sex
        )
        return obj

    # 非绑定方法
    @staticmethod
    def create_id():
        m = hashlib.md5(str(time.time()).encode('utf-8'))
        return m.hexdigest()


p = People('lucy', 20, 'female')

# 绑定给对象,就应该由对象来调用,自动将对象本身当作第一个参数传入
p.tell_info()  # tell_info(p)

# 绑定给类,就应该由类来调用,自动将类本身当作第一个参数传入
p = People.from_conf()
p.tell_info()

# 非绑定方法,不与类或者对象绑定,谁都可以调用,没有自动传值一说
p1 = People('jove1',18,'male')
time.sleep(1)
p2 = People('jove2',28,'male')
time.sleep(1)
p3 = People('jove3',38,'male')

print(p1.id)
print(p2.id)
print(p3.id)

代码输出如下:

        总的来说,绑定方法与非绑定方法使用时若类中需要一个功能,该功能的实现代码中需要引用对象则将其定义成对象方法;该功能需要引用类则将其定义成类方法;该功能无需引用类或对象则将其定义成静态方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

逆向攻防世界CTF系列39-debug

逆向攻防世界CTF系列39-debug 查了资料说.NET要用其它调试器,下载了ILSPY和dnSPY ILSPY比较适合静态分析代码最好了,函数名虽然可能乱码不显示,但是单击函数名还是能跟踪的,而dnSPY在动态调试上效果好,它的函数名不仅…

Spring-事务学习

spring事务 1. 什么是事务? 事务其实是一个并发控制单位,是用户定义的一个操作序列,这些操作要么全部完成,要不全部不完成,是一个不可分割的工作单位。事务有 ACID 四个特性,即: 原子性(Atom…

RHCE的学习(21)

第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句,例如判断语句和循环语句中…

用pyspark把kafka主题数据经过etl导入另一个主题中的有关报错

首先看一下我们的示例代码 import os from pyspark.sql import SparkSession import pyspark.sql.functions as F """ ------------------------------------------Description : TODO:SourceFile : etl_stream_kafkaAuthor : zxxDate : 2024/11/…

单片机_day3_GPIO

目录 1. 灯如何才能亮 1.1原理图 1.2 二极管 1.3 换了一个灯和原理图 ​编辑 1.4 三极管 1.4.1 NPN型三极管 1.4.2 PNP型三极管 2. 基本概念 3. 输入 3.1 浮空输入 3.2 上拉输入 3.3 下拉输入 3.4 模拟输入 4. 输出 4.1 推挽输出 4.2 开漏输出 如何让开漏输出…

基于视觉智能的时间序列基础模型

GitHub链接:ViTime: A Visual Intelligence-Based Foundation Model for Time Series Forecasting 论文链接:https://github.com/IkeYang/ViTime 前言 作者是来自西安理工大学,西北工业大学,以色列理工大学以及香港城市大学的研…

java项目-jenkins任务的创建和执行

参考内容: jenkins的安装部署以及全局配置 1.编译任务的general 2.源码管理 3.构建里编译打包然后copy复制jar包到运行服务器的路径 clean install -DskipTests -Pdev 中的-Pdev这个参数用于激活 Maven 项目中的特定构建配置(Profile) 在 pom.xml 文件…

Qt按钮类-->day09

按钮基类 QAbstractButton 标题与图标 // 参数text的内容显示到按钮上 void QAbstractButton::setText(const QString &text); // 得到按钮上显示的文本内容, 函数的返回就是 QString QAbstractButton::text() const;// 得到按钮设置的图标 QIcon icon() const; // 给按钮…

论文6—《基于YOLOv5s的深度学习在自然场景苹果花朵检测中的应用》文献阅读分析报告

论文报告:基于YOLOv5s的深度学习在自然场景苹果花朵检测中的应用 基于YOLOv5s的深度学习在自然场景苹果花朵检测中的应用 摘要国内外研究现状1. 疏花技术研究2. 目标检测算法研究 研究目的研究问题使用的研究方法试验研究结果文献结论创新点和对现有研究的贡献1. Y…

「人眼视觉不再是视频消费的唯一形式」丨智能编解码和 AI 视频生成专场回顾@RTE2024

你是否想过,未来你看到的电影预告片、广告,甚至新闻报道,都可能完全由 AI 生成? 在人工智能迅猛发展的今天,视频技术正经历着一场前所未有的变革。从智能编解码到虚拟数字人,再到 AI 驱动的视频生成&#…

计算机毕业设计Python美食推荐系统 美团爬虫 美食可视化 机器学习 深度学习 混合神经网络推荐算法 Hadoop Spark 人工智能 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

GPU分布式通信技术-PCle、NVLink、NVSwitch深度解析

GPU分布式通信技术-PCle、NVLink、NVSwitch 大模型时代已到来,成为AI核心驱动力。然而,训练大模型却面临巨大挑战:庞大的GPU资源需求和漫长的学习过程。 要实现跨多个 GPU 的模型训练,需要使用分布式通信和 NVLink。此外&#xf…

MySQL:联合查询(2)

首先写一个三个表的联合查询 查询所有同学的每门课成绩,及同学的个人信息 1.我们首先要确定使用哪些表 学生表,课程表,成绩表 2.取笛卡尔积 select * from score,student,course; 3. 确定表与表之间的联合条件 select * from score,stud…

【leetcode】704. 二分查找

注意一般mid left (right-left)/2; 不要用mid (right - left)/2 中间值的计算需要考虑到整型溢出的问题。 如果使用 mid (right - left) / 2 的方式计算中间值,那么在 right 和 left 的值接近极限值的情况下,可能会导致计算出的中间值发生整型溢出&…

RHCE的练习(12)

写一个脚本,完成以下要求: 给定一个用户: 如果其UID为0,就显示此为管理员;否则,就显示其为普通用户; #!/bin/bash ​ # 使用read命令获取用户名 read -p "请输入用户名: " username ​…

WPF-控件的属性值的类型转化

控件的属性值需要转成int、double进行运算的&#xff0c;可以使用一下方法 页面代码 <StackPanel Margin"4,0,0,0" Style"{StaticResource Form-StackPanel}"> <Label Content"替换后材料增加金额&#xff…

【从零开始的LeetCode-算法】3270. 求出数字答案

给你三个 正 整数 num1 &#xff0c;num2 和 num3 。 数字 num1 &#xff0c;num2 和 num3 的数字答案 key 是一个四位数&#xff0c;定义如下&#xff1a; 一开始&#xff0c;如果有数字 少于 四位数&#xff0c;给它补 前导 0 。答案 key 的第 i 个数位&#xff08;1 < …

iMetaOmics | 刘永鑫/陈同-用于食物微生物组成和时间序列研究的微生物组数据库FoodMicroDB...

点击蓝字 关注我们 FoodMicroDB&#xff1a;用于食物微生物组成和时间序列研究的微生物组数据库 iMeta主页&#xff1a;http://www.imeta.science 研究论文 ● 原文链接DOI: https://doi.org/10.1002/imo2.40 ● 2024年11月1日&#xff0c;中国农业科学院深圳农业基因组研究所刘…

视觉slam十四讲 ch8 光流法和直接法

之前的都是单层光流 转载至Blibli 视觉SLAM十四讲_7视觉里程计1_计算相机运动_哔哩哔哩_bilibili

QSS 设置bug

问题描述&#xff1a; 在QWidget上add 一个QLabel&#xff0c;但是死活不生效 原因&#xff1a; c 主程序如下&#xff1a; QWidget* LOGO new QWidget(logo_wnd);LOGO->setFixedSize(logo_width, 41);LOGO->setObjectName("TittltLogo");QVBoxLayout* tit…