艺赛旗RPA--经验分享:Python 中的“特殊”函数

2023-10-31

了解RPA:
www.i-search.com.cn

学习RPA
https://support.i-search.com.cn/

“ 私有函数,魔法函数,回调函数”

在任何编程语言中,都会规定某些对象 (属性、方法、函数、类等) 只能够在某个范围内访问,出了这个范围就不能访问了。这是“公”、“私”之分。此外,还会专门为某些特殊的东西指定一些特殊表示,比如类的名字就不能用 class,def 等,这就是保留字。除了保留字,python 中还为类的名字做了某些特殊准备,就是“专有”的范畴。

01

私有函数

有时在项目中会看到这样一些函数。

图片

图片

在某些时候,会看到有一种方法命名比较特别,是以“__”双划线开头的,将这类命名的函数 / 方法称之为“私有函数”。

所谓私有函数,不可以从它们的模块外面被调用;私有类方法不能够从它们的类外面被调用;私有属性不能够从它们的类外面被访问。跟私有对应的,就是所谓的公有啦。有的编程语言用特殊的关键词来说明某函数或方法或类是私有还是公有。但是 python 仅仅用名字来说明,因为 python 深刻理解了两千年前孔子所说的“名不正言不顺”的含义。

如果一个 python 函数, 类方法, 或属性的名字以两个下划线开始 (但不是结束), 它是私有的; 其它所有的都是公有的。类方法或者是私有 (只能在它们自已的类中使用) 或者是公有 (任何地方都可使用)。

例如:

class Person:

def init(self, name):
self.name = name
print(self.name)

def __work(self, salary):
print("%s salary is: %d" % (self.name, salary))
if name == “main”:
officer = Person(“Tom”)
officer.__work(1000)

运行结果:

Tom
Traceback (most recent call last):
File “C:/Users/Administrator/PycharmProjects/Myworld/work.py”, line 13, in
officer.__work(1000)
AttributeError: ‘Person’ object has no attribute ‘__work’

从运行结果中可以看出,当运行到 officer.__work(1000) 的时候,报错了。并且从报错信息中说,没有该方法。这说明,这个私有方法,无法在类外面调用(其实类外面可以调用私有方法,就是太麻烦,况且也不提倡)。

将上述代码进行如下修改:
class Person:
def init(self, name):
self.name = name
print(self.name)

def __work(self, salary):
print("%s salary is: %d" % (self.name, salary))

def worker(self):
self.__work(500) # 在类内部调用私有方法
if name == “main”:
officer = Person(“Tom”) # Tom

officer.__work(1000)

officer.worker() # Tom salary is: 500

得到正确结果

02

魔法函数

有时在项目中会看到这样一些函数。

图片

如果是以双划线开头,但不是以它结尾,所命名的方法是私有方法;

如果以双划线开头,并且以双划线结尾,所命名的方法就是专有方法。也叫魔法函数。

比如内置函数 init(), 就是一个典型的专有方法。关于专有方法,除了 init() 之外,还有诸如:str,setitem 等等,要想看,可以利用 dir() 函数在交互模式下看看某个函数里面的专有方法。

例如:

python code to demonstrate example of
dir() number
class std_info:
name = “Amit shukla”
age = 21
course = “B.Tech (CS)”

printing return type of dir() function
print(“return type of dir():”, type(dir(std_info)))

printing details using dir() function
print(dir(std_info))

查看结果:

return type of dir(): <class ‘list’>
[‘class’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’,
‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’,
‘hash’, ‘init’, ‘le’, ‘lt’, ‘module’, ‘ne’,
‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘se
tattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘weakref’,
‘age’, ‘course’, ‘name’]

魔法函数:init()

所有类的超类 object,有一个默认包含 pass 的 __ init __() 实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对象属性就不会被初始化,虽然我们仍然可以对其进行赋值,但是它已经成了隐式的了,编程时显示远比隐式的更好。

看下面的小栗子:

class test_1:
def method(self):
self.a = “1”
self.b = “2”
return self.a,self.b

class test_2:
def init(self):
self.a = “1”
self.b = “2”

def method(self):
return self.a,self.b

print(vars(test_1()))
print(“-”*10)
print(vars(test_2()))
“”"
{}
{‘a’: ‘1’, ‘b’: ‘2’}
“”"

我们可以通过 vars 函数获知显示声明的属性,但是隐式的就无法获知了,这并不值得提倡,但是在知道参数的情况下我们还是可以对其进行赋值的,如下:

class test_1:
def method(self):
return self.a, self.b

class test_2:
def init(self):
self.a = “1”
self.b = “2”

def method(self):
return self.a, self.b

t1 = test_1()
t1.a = 1
t1.b = 2
print(t1.method()) # (1, 2)
print(‘-’ * 10)
t2 = test_2()
t2.a = 3
t2.b = 4
print(t2.method()) # (3, 4)

03

回调函数

回调函数就是一个通过函数名调用的函数。如果你把函数的名字(地址)作为参数传递给另一个函数,当这个参数被用来调用其所指向的函数时,我们就说这是回调函数.

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应.

上面是对回调函数的描述和解释, 概念往往都显得生涩拗口, 不易理解.

简单来说, 我们可以这样理解回调,A 实现了 A1 函数和 A3 函数,B 实现了 B2 函数,B2 函数接收一个函数名字作为参数, 然后在 B2 内执行这个函数.

在实际应用时,A1 函数调用了 B2,B2 函数接收函数 A3 作为参数, 在 B2 内部执行 A3 函数,A3 就是回调函数.

文章来源艺赛旗社区:风吹来的沙

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

艺赛旗RPA--经验分享:Python 中的“特殊”函数 的相关文章

随机推荐

  • 设置linearlayout最大高度_数据中心:主要设备用房高度需求及建筑层高规划

    主要设备用房高度需求 数据中心主要设备用房为35KV开闭所 10KV开闭所 低压变配电房 动力 低压变配电房 IT UPS 柴油发电机组 冷冻机房 IT机房模块间等 35KV开闭所通常单独设置不在IT机房大楼内布置 本文不再讨论 各设备用房
  • Nginx服务优化

    配置nginx隐藏版本号 隐藏nginx版本号 避免安全漏洞泄漏 方法一 修改配置文件法 root www conf vim usr local nginx confnginx conf 17 http 18 include mime ty
  • 图解---散列表(hash表)的基本原理以及hash冲突(碰撞)--易懂版

    图解 散列表 hash表 的基本原理以及hash冲突 碰撞 易懂版 散列表为什么诞生 它用于做什么 先说说数组 数组的优点是查找比较快 但是添加和删除效率比较低 再说说链表 链表的优点是添加和删除效率比较快 相对于数组 但是遍历需要一个指针
  • 一种软件网络验证方式的实现 + 网络验证转本地验证的一种实现(附VC源码)...

    目前很多软件都是通过网络验证来实现的 一种比较流行的方式便是把服务器端 如验证网页 放在服务器上 软件为客户端 当软件注册或启动时通过网络与服务器端进行数据交换 重新实现验证的目的 个人觉得网络验证将是一种趋势 做得好的网络验证方式将是对软
  • Spring 源码 事件监听

    2019独角兽企业重金招聘Python工程师标准 gt gt gt spring 监听器 一 事件监听机制概述 二 事件监听机制结构 三 Spring监听机制架构 Spring的Application拥有发布事件并且注册事件监听器的能力 拥
  • python验证码识别MuggleOCR通用识别使用

    先来看看MuggleOCR简介 白嫖 这是一个为麻瓜设计的本地OCR模块 只需要简单几步操作即可拥有两大通用识别模块 让你在工作中畅通无阻 这套模型是基于 https github com kerlomz captcha trainer 训
  • JSP注释(4种)

    说到注释 相信大家肯定都不陌生 它是对程序代码的解释和说明 注释可以提高代码的可读性 让他人能够更加轻松地了解代码 从而提高团队合作开发的效率 在 JSP 中可以使用以下 4 种注释 HTML 注释 带有 JSP 表达式的注释 隐藏注释 脚
  • 登录和注册的基本实现,超简单!

    前序 相信有很多的人在刚刚做项目的实现 登录与注册功能的实现是基本的要求 要是刚刚开始写的小伙伴肯定会有很多的困惑 这里我介绍一下自己的写法 希望能帮到你 也希望能免费点个小 这里就以之前我写的一个为例 大家可以根据自己的规则来更改 一 登
  • python 短路法提高二叉堆插入效率

    在学习 problem solving with algorithms and data structure using python 中的二叉堆时 其插入数据方法是将这个数据放在列表的尾部 然后通过一次次与父节点进行比较 并且交换 实现顺
  • 用Log4j 2记录日志

    说明 maven工程中增加对Log4j 2的依赖 下面代码示例的maven工程中的pom xml文件中需要增加对Log4j 2的依赖
  • -moz-transform:rotate()

    目前越来越多的浏览器兼容CSS3标准了 就连IE浏览器老大哥也开始向CSS3低头 微软宣布IE9浏览器支持更多的CSS3属性 IE9更注重HTML5标准 不过CSS3里有一个使对象旋转的属性transform rotate 号称兼容CSS3
  • 2023高教社杯 国赛数学建模B题思路 - 多波束测线问题

    1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术 声波在均匀介质中作匀 速直线传播 在不同界面上产生反射 利用这一原理 从测量船换能器垂直向海底发射声波信 号 并记录从声波发射到信号接收的传播时间
  • springboot定时任务

    1 配置 在主函数加 EnableScheduling 定时任务 package com biubiu import org springframework boot SpringApplication import org springf
  • golang的web框架Gin(一)---Gin的安装与初体验

    简介 1 1 介绍 Go世界里最流行的Web框架 Github上有32K star 基于httprouter开发的Web框架 中文文档齐全 简单易用的轻量级框架 Gin是一个golang的微框架 封装比较优雅 API友好 源码注释比较明确
  • [已解决]运行 ‘tomcat8‘ 出错: 无法打开调试器端口 (127.0.0.1:6672): java.net.SocketException

    解决 运行 tomcat8 出错 无法打开调试器端口 127 0 0 1 6672 java net SocketException 修改HTTP port端口号 没占用的端口号都可以 建议8000以上的数字 只要不是现在的端口号就可以 修
  • ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)

    参考 Linux之ARM IMX6U 裸机按键输入实验 GPIO的输出与输入 作者 一只青木呀 发布时间 2020 08 17 21 43 37 网址 https blog csdn net weixin 45309916 article
  • Python实现顺序表

    Python实现顺序表 关于顺序表的介绍 请参考 https blog csdn net weixin 43790276 article details 103848039 Python 中的列表和元组都属于顺序表 下面根据顺序表的特性 自
  • 段错误的调试方法(printf输出、GDB)

    参考 段错误产生原因及简单的调试方法 参考 如何解决段错误 参考 C语言gdb调试之精髓 常用命令 多进程 多线程 程序日志 网址 https www bilibili com video BV1ei4y1V758 from search
  • 1031. 查验身份证(15)

    一个合法的身份证号码由17位地区 日期编号和顺序编号加1位校验码组成 校验码的计算规则如下 首先对前17位数字加权求和 权重分配为 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 然后将计算的和对11取模得到值Z 最
  • 艺赛旗RPA--经验分享:Python 中的“特殊”函数

    了解RPA www i search com cn 学习RPA https support i search com cn 私有函数 魔法函数 回调函数 在任何编程语言中 都会规定某些对象 属性 方法 函数 类等 只能够在某个范围内访问 出