最近在学习类过程中,绑定方法这个概念没有理解透彻,所以在网上找了很多相关博客、文章研究到底是怎么一回事。因为有的文章所陈述与我在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的方法,通过类或者实例调用,得到的都是普通函数。

python方法定义..._解析Python类中的方法定义相关推荐

  1. python类内部方法调用_python如何调用类中的方法

    调用同一个类中的方法 首先类中的方法在定义的时候需要先加参数self,例如:def SaveData(self,ip): print(ip)如果无self参数则不能在同一个类中调用(之前一直在这里犯错 ...

  2. @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...

    Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...

  3. java通过反射调用方法_Java_通过反射调用类中的方法

    packagecom.lkb.autoCode.util;importcom.lkb.autoCode.constant.AutoCodeConstant;importjava.lang.reflec ...

  4. Python 学习笔记 系统模块 面对对象思想 类和对象 类中的方法与对象 构造函数和析构函数

    一.系统模块: UTC:国际标准时间, 格林尼治天文时间,UTC+8 时间戳:指定时间距离1970.1.1 00:00:00的秒数 time:时间 datetime:日期 calendar:万年历 o ...

  5. 反射_通过反射调用类中指定方法、属性

    一.调用指定方法 通过反射,调用类中的方法,通过Method类完成.步骤: 1.通过Class类的getMethod(String name,Class.......parameterTypes)方法 ...

  6. python类定义中__init__()_转:python学习——类中为什么要定义__init__()方法

    学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. 1 classRectangl ...

  7. 第8.12节 Python类中使用__dict__定义实例变量和方法

    上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...

  8. Python笔记_23_正则相关函数_类中的方法_装饰器_异常

    文章目录 正则相关函数 search 和 match split 切割 sub 替换 finditer 匹配字符串中相应内容,返回迭代器 compile 指定一个统一的匹配规则 正则表达式的修饰符 类 ...

  9. python装饰器特性iy雾_扣丁学堂简述Python 装饰器装饰类中的方法

    扣丁学堂简述 Python 装饰器装饰类中的方法 本篇文章小编主要和读者们分享一下 Python 装饰器装饰类中的方法, 文中会有详细的代码 列出供大家参考,下面随小编一起来了解一下吧. 有一个类 T ...

最新文章

  1. 三年后75%企业数据将移至云端?SAP新应用加速云服务
  2. python dir函数查看函数名
  3. (三)如何成为优秀的数据分析师
  4. 线程的三种创建方式以及代码实现
  5. Jquery导航条淡进淡出相册(动态无刷新加载数据库数据)
  6. Elixir 1.7改进错误处理、日志和测试
  7. native和html5的通信方案
  8. 锁php_php+redis实现分布式锁
  9. 串口485接法图_RS485通讯的正确接线方式介绍
  10. RC有源滤波器之低通滤波器(一)
  11. 【嗅探工具】无线WIFI密码破解
  12. 云服务器被攻击了怎么解决?恢复需要多久?
  13. FJUT 1735 开宝箱
  14. 全国php工资城市排名,2019年各城市工资排行_2019年全国各城市最新工资排行出炉 想去哪玩来对...
  15. 高数笔记基础篇(更完)
  16. 基于指标选择的多目标搜索(IBEA)
  17. java 20008年月历输出 日期的个位与星期数相等 的日子
  18. Jensen–Shannon divergence
  19. Verilog HDL高级数字设计 从零学习(一)
  20. 连开三场发布会之后,苹果这款产品卖得最好

热门文章

  1. TextRank、BM25算法提取关键字、文章自动摘要优秀文章保存
  2. java中的包装流和缓冲流概述
  3. 基于MaxCompute+PAI的用户增长方案实践
  4. 阿里云SAG2.0发布,助力企业全球互联
  5. 极测未来|淘宝千人千面内容下的智能评测技术与实践
  6. 分布式事务中间件 Fescar - 全局写排它锁解读 1
  7. 1 分钟记住 docker 镜像和容器常用基本命令
  8. 抽象思想解读Linux进程描述符
  9. 【IPF2020】浪潮集团高级副总裁彭震:智算中心 筑基智慧世界
  10. 容器精华问答 | 我们为什么需要容器?