python方法定义..._解析Python类中的方法定义

06ddd4a52250114cfa51f9d1496cb47f.png

最近在学习类过程中,绑定方法这个概念没有理解透彻,所以在网上找了很多相关博客、文章研究到底是怎么一回事。因为有的文章所陈述与我在python3.5版本实际实验中有些出入,所以经过实践后总结出以下结论。

对于Python类中,方法的定义方式,我们可以归纳有4种类型:

1、不带self、cls参数且不加装饰器(staticmethod、classmethod)2、正常的方法定义,带self参数3、类方法:加装饰器(classmethod)4、静态方法:加装饰器(staticmethod)

下面对每一种定义的方式进行分析:

1、不带self、cls参数且不加装饰器(staticmethod、classmethod)

定义代码如下:

class Student(object):def func(name):print('my name is {}'.format(name))

我们通过用类和实例分别调用该方法:

print(Student.func)
Student.func('Tom')
print(Student().func)
Student().func('Tom')

类调用output:

<function Student.func at 0x0000000000D7D268>
my name is Tom
[Finished in 0.1s]

实例调用output:

<bound method Student.func of <__main__.Student object at 0x0000000000D444A8>>
Traceback (most recent call last):File "I:MyProjectawesome-python3-webappwwwfor_test.py", line 11, in <module>Student().func('Tom')
TypeError: func() takes 1 positional argument but 2 were given
[Finished in 0.2s with exit code 1]

从上面的输出我们可以看出,此种定义方法,如果用类来调用该方法,那么这个方法就只是一个函数,不会像绑定方法一样会自动传值。传参只需按照正常的函数传参即可;如果用实例来调用该方法,那么这个方法就是绑定(bound)的方法,既然是绑定方法,那么就会自动把Student()自身作为第一个参数传到方法中去,所以Student().func('Tom')会传实例Student()以及'Tom'两个参数到此方法,但是由于此方法定义时只定义了一个参数,所以就会有上述的报错。

2、正常的方法定义,带self参数

定义代码如下:

class Student(object):def func(self, name):print('my name is {}'.format(name))

类调用该方法:

print(Student.func)
Student.func('Tom')

output:

<function Student.func at 0x000000000070D268>
Traceback (most recent call last):File "I:MyProjectawesome-python3-webappwwwfor_test.py", line 8, in <module>Student.func('Tom')
TypeError: func() missing 1 required positional argument: 'name'
[Finished in 0.2s with exit code 1]

用类调用该方法,跟第一种情况一样,依然是一个函数。因为此函数有两参数(selfname),由于实参'Tom'是传到了形参self,所以输出中提示调用func方法少了name参数。正确的调用方式为Student.func(Student(), 'Tom')

用实例调用该方法:

print(Student().func)
Student().func('Tom')

output:

<bound method Student.func of <__main__.Student object at 0x00000000006E44A8>>
my name is Tom
[Finished in 0.2s]

可以看出实例调用该方法,得到是绑定的方法,Student()Tom参数,分别传给形参selfname

其实第一种和第二种定义的方法是一样的,而他们的区别只是有没有self这个参数。只要是实例调用这个方法,都是绑定的方法。都会自动将实例自身作为第一个参数传递进去。self这个参数,是大家约定俗成的一种参数命名,命名成a或者b都是可以的,只不过这样命名会降低代码的可读性。下面要说的类方法中的cls参数也是这个道理。

3、类方法:加装饰器(classmethod)

定义代码如下:

class Student(object):@classmethoddef func(cls, name):print('my name is {} from {}'.format(name, cls.__name__))

用类和实例分别调用该方法:

print(Student.func)
Student.func('Tom')
print(Student().func)
Student().func('Tom')

output:

<bound method Student.func of <class '__main__.Student'>>
my name is Tom from Student
<bound method Student.func of <class '__main__.Student'>>
my name is Tom from Student
[Finished in 0.2s]

可以看出,此种定义方式,用类或者实例调用,都是绑定的方法。用类调用,会将类自身作为第一个参数传递到方法中。用实例调用,会将实例所属的类作为第一个参数传递到方法中。

4、静态方法:加装饰器(staticmethod)

定义代码如下:

class Student(object):@staticmethoddef func(name):print('my name is {}'.format(name))

用类和实例分别调用该方法:

print(Student.func)
Student.func('Tom')
print(Student().func)
Student().func('Tom')

output:

<function Student.func at 0x0000000000D6D268>
my name is Tom
<function Student.func at 0x0000000000D6D268>
my name is Tom
[Finished in 0.2s]

从上面的输出代码中,可以看出,使用装饰器staticmethod装饰的函数,只是一个普通函数,没有绑定方法的自动传值功能,传参只需按照正常的函数传参即可。

综合上面分析,我们可以总结如下:

1、凡是类中的方法、函数,如果没有加装饰器,当通过类来调用的时候,得到的是普通的函数,当通过实例来调用的时候,得到的是绑定方法;
2、加装饰器classmethod的方法,无论是通过类或者实例来调用,得到的都是绑定方法,python会自动将类本身或者实例所属的类作为第一个参数传递进去;
3、加装饰器staticmethod的方法,通过类或者实例调用,得到的都是普通函数。

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

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

相关文章

阿里巴巴复杂搜索系统的可靠性优化之路

背景 搜索引擎是电商平台成交链路的核心环节&#xff0c;搜索引擎的高可用直接影响成交效率。闲鱼搜索引擎作为闲鱼关键系统&#xff0c;复杂度和系统体量都非常高&#xff0c;再加上闲鱼所有导购场景都依靠搜索赋能&#xff0c;搜索服务的稳定可靠成为了闲鱼大部分业务场景可…

Kubernetes 将何去何从?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | Kevin Casey译者 | 弯月责编 | 唐小引封图 | CSDN 付费自图虫创意出品 | CSDN 云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;【导读】随着越来越多的人开始使用 Kubernetes&#xff0c;IT 领导者对新的一年有哪些期…

活体检测很复杂?仅使用opencv就能实现!(附源码)

什么是活体检测&#xff0c;为什么需要它&#xff1f; 随着时代的发展&#xff0c;人脸识别系统的应用也正变得比以往任何时候都更加普遍。从智能手机上的人脸识别解锁、到人脸识别打卡、门禁系统等&#xff0c;人脸识别系统正在各行各业得到应用。然而&#xff0c;人脸识别系…

Pod在多可用区worker节点上的高可用部署

一、 需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS&#xff0c;这种部署方式的目的是可以让一个应用的多个pod&#xff08;至少两个&#xff09;能够分布在不同的可用区&#xff0c;起码不能分布在同一个可用区&#xff0c;已达到高可用或者同…

揭秘:蚂蚁金服bPaaS究竟是什么?

去年9月&#xff0c;蚂蚁金服在杭州云栖ATEC发布了分布式金融核心套件bPaaS&#xff08; Business Platform As a Service &#xff09;&#xff0c;对外开放自身沉淀的“产品合约”、“资产交换”、“资产核心”、“会计核算”、“计价” 等金融核心组件&#xff0c;而这款号称…

云计算的 2020:云原生崛起,重新定义软件!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | Ashish Sukhadeve译者 | 弯月责编 | 唐小引封图 | CSDN 付费自图虫创意出品 | CSDN 云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;随着 2006 年末 AWS S3 数据存储的问世&#xff0c;云计算发展成为了 IT 行业的三…

用PL/SQL Develpoer工具完成导入和导出

文章目录一、用PL/SQL Develpoer工具完成导入导出1. 导出2. 导入3. 补充前言&#xff1a;首先&#xff0c;我们导入导出数据&#xff0c;肯定是要通过oracle自带的可运行程序来完成数据的导入导出工作&#xff0c;imp.exe 和exp.exe这两个可运行文件都放在oracle安装目录下的BI…

关于Paxos 幽灵复现问题的看法

由于郁白之前写的关于Multi-Paxos 的文章流传非常广, 原文提出了一个叫"幽灵复现" 的问题, 认为这个是一个很诡异的问题, 后续和很多人交流关于一致性协议的时候, 也经常会提起这个问题, 但是其实这个问题我认为就是常见的"第三态"问题加了一层包装而已. …

idea spring boot 修改 html,js 等不用重启即时生效

1、【File】-【Settings】-【Build,Execution,Deplyment】-【Compiler】&#xff0c;选中打勾 Build project automatically 2、 组合键&#xff1a;ShiftCtrlAlt/&#xff0c;选择 Registry &#xff0c;选中打勾 compiler.automake.allow.when.app.running” 3、找到你要运…

阿里巴巴微服务开源项目盘点(持续更新)

大前端、微服务、数据库、更多精彩&#xff0c;尽在开发者分会场 【Apache Dubbo】 Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架&#xff0c;是国内影响力最大、使用最广泛的开源服务框架之一&#xff0c;它提供了三大核心能力&#xff1a;面向接口的远程方法调用&…

100行Python代码理解深度学习关键概念:从头构建恶性肿瘤检测网络

在构建乳腺癌预测神经网络过程中&#xff0c;我们主要分为3大部分&#xff1a; 1.用Python从零开始创建一个神经网络&#xff0c;并使用梯度下降算法训练模型。 2.在该神经网络中使用威斯康星乳腺癌数据集&#xff0c;根据9种不同的特征&#xff0c;预测肿瘤是良性还是恶性的…

开发者在行动!中国防疫开源项目登上 GitHub TOP 榜

用开发者们的方式支援这场没有硝烟的战争&#xff01;整理 | 唐小引出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;截止北京时间 1 月 28 日下午 15:47&#xff0c;全国确诊新型冠状病毒的数字已经到达了 4586 例&#xff0c;疑似高达 6973 例&#xff0c;医护人员…

自动化测试|录制回放效果差异检测

概述 回归测试是指修改了旧代码后&#xff0c;重新进行测试以确认修改没有引入新的错误或导致其他的代码出现错误。传统的自动化回归测试需要手动编写脚本获得页面元素的视图树&#xff0c;与原有的元素视图树进行比对。当功能进行频繁迭代时&#xff0c;测试同学维护这些视图…

为什么我学了6个月Python,还是找不到工作?

在知乎上有一个特别火的问题&#xff1a;为什么学了Python&#xff0c;我还是找不到工作&#xff1f;有人说Python语言不行&#xff0c;有人说中国Python根本就没公司用。在大家群嘲的背后&#xff0c;我们来分析一下&#xff1a;为什么大家都不看好Python&#xff1f;学Python…

阿里工程师养了只“二哈”,专治讨厌的骚扰电话

前几天的3.15晚会上曝光了利用智能机器人&#xff0c;一天打4万个骚扰电话&#xff0c;从而赚取利润的黑色产业链。 阿里的工程师恼了&#xff0c;技术是用来让人们生活变美好的&#xff0c;不是被利用来走向阴暗的。 机器人的问题交给机器人&#xff01; 工程师们用业余时间…

excel按条件查询mysql_Excel中实现多条件查找的15种方法

如下图所示&#xff0c;根据第9行的产品和型号&#xff0c;从上面表中查找“销售数量”&#xff0c;结果如C10所示1、SUM函数公式{SUM((A2:A6A9)*(B2:B6B9)*C2:C6)}公式简介&#xff1a;使用(条件)*(条件)因为每行符合条件的为0&#xff0c;不符合的为1&#xff0c;所以只有条件…

JVM调优_堆内存溢出和非堆内存溢出

文章目录1. pom2. MemoryController3. User 对象4. 动态生成class文件工具类5. 启动项目6. 测试连接7. 异常信息1. pom <!--动态生成class文件--><dependency><groupId>asm</groupId><artifactId>asm</artifactId><version>3.3.1<…

使用split_size优化的ODPS SQL的场景

使用split_size优化的ODPS SQL的场景 首先有两个大背景需要说明如下&#xff1a; 说明1&#xff1a;split_size&#xff0c;设定一个map的最大数据输入量&#xff0c;单位M&#xff0c;默认256M。用户可以通过控制这个变量&#xff0c;从而达到对map端输入的控制。设置语句&am…

「今天沾一口野味,明天地府相会!」AI如何抗击「野味肺炎」

河南信阳七星鹏社区宣&#xff08;来源&#xff1a;微博-在信阳&#xff09;整理 | 阿司匹林出品 | CSDN云计算「今天沾一口野味&#xff0c;明天地府相会&#xff01;」这是本次在抗战「野味肺炎」一线中表现突出的河南人民打出的标语。为什么本次疫情被称为「野味肺炎」&…

如何自动导出内存映像文件?

内存溢出自动导出&#xff1a; -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./测试&#xff1a; http://localhost/heap-Xmx32M -Xms32M -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./