python方法定义..._解析Python类中的方法定义
最近在学习类过程中,绑定方法这个概念没有理解透彻,所以在网上找了很多相关博客、文章研究到底是怎么一回事。因为有的文章所陈述与我在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]
用类调用该方法,跟第一种情况一样,依然是一个函数。因为此函数有两参数(self
和name
),由于实参'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
参数,分别传给形参self
和name
。
其实第一种和第二种定义的方法是一样的,而他们的区别只是有没有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类中的方法定义相关推荐
- python类内部方法调用_python如何调用类中的方法
调用同一个类中的方法 首先类中的方法在定义的时候需要先加参数self,例如:def SaveData(self,ip): print(ip)如果无self参数则不能在同一个类中调用(之前一直在这里犯错 ...
- @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...
Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...
- java通过反射调用方法_Java_通过反射调用类中的方法
packagecom.lkb.autoCode.util;importcom.lkb.autoCode.constant.AutoCodeConstant;importjava.lang.reflec ...
- Python 学习笔记 系统模块 面对对象思想 类和对象 类中的方法与对象 构造函数和析构函数
一.系统模块: UTC:国际标准时间, 格林尼治天文时间,UTC+8 时间戳:指定时间距离1970.1.1 00:00:00的秒数 time:时间 datetime:日期 calendar:万年历 o ...
- 反射_通过反射调用类中指定方法、属性
一.调用指定方法 通过反射,调用类中的方法,通过Method类完成.步骤: 1.通过Class类的getMethod(String name,Class.......parameterTypes)方法 ...
- python类定义中__init__()_转:python学习——类中为什么要定义__init__()方法
学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. 1 classRectangl ...
- 第8.12节 Python类中使用__dict__定义实例变量和方法
上节介绍了使用实例的__dict__查看实例的自定义属性,其实还可以直接使用__dict__定义实例变量和实例方法. 一. 使用__dict__定义实例变量 语法: 对象名. dict[属性名] = ...
- Python笔记_23_正则相关函数_类中的方法_装饰器_异常
文章目录 正则相关函数 search 和 match split 切割 sub 替换 finditer 匹配字符串中相应内容,返回迭代器 compile 指定一个统一的匹配规则 正则表达式的修饰符 类 ...
- python装饰器特性iy雾_扣丁学堂简述Python 装饰器装饰类中的方法
扣丁学堂简述 Python 装饰器装饰类中的方法 本篇文章小编主要和读者们分享一下 Python 装饰器装饰类中的方法, 文中会有详细的代码 列出供大家参考,下面随小编一起来了解一下吧. 有一个类 T ...
最新文章
- 三年后75%企业数据将移至云端?SAP新应用加速云服务
- python dir函数查看函数名
- (三)如何成为优秀的数据分析师
- 线程的三种创建方式以及代码实现
- Jquery导航条淡进淡出相册(动态无刷新加载数据库数据)
- Elixir 1.7改进错误处理、日志和测试
- native和html5的通信方案
- 锁php_php+redis实现分布式锁
- 串口485接法图_RS485通讯的正确接线方式介绍
- RC有源滤波器之低通滤波器(一)
- 【嗅探工具】无线WIFI密码破解
- 云服务器被攻击了怎么解决?恢复需要多久?
- FJUT 1735 开宝箱
- 全国php工资城市排名,2019年各城市工资排行_2019年全国各城市最新工资排行出炉 想去哪玩来对...
- 高数笔记基础篇(更完)
- 基于指标选择的多目标搜索(IBEA)
- java 20008年月历输出 日期的个位与星期数相等 的日子
- Jensen–Shannon divergence
- Verilog HDL高级数字设计 从零学习(一)
- 连开三场发布会之后,苹果这款产品卖得最好