Python进阶(十二)-浅谈python中的方法
来源:互联网 发布:淘宝上发光闹钟说明书 编辑:程序博客网 时间:2024/06/06 18:02
Python进阶(十二)-浅谈python中的方法
我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象:
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
return 'A'
p1 = Person('Bob', 90)
print p1.get_grade
# => <bound method Person.get_grade of <__main__.Person object at 0x109e58510>>
print p1.get_grade()
# => A
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
也就是说,p1.get_grade 返回的是一个函数对象,但这个函数是一个绑定到实例的函数,p1.get_grade() 才是方法调用。
因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType() 把一个函数变为一个方法:
import types
def fn_get_grade(self):
if self.score >= 80:
return 'A'
if self.score >= 60:
return 'B'
return 'C'
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
p1 = Person('Bob', 90)
p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
print p1.get_grade()
# => A
p2 = Person('Alice', 65)
print p2.get_grade()
# ERROR: AttributeError: 'Person' object has no attribute 'get_grade'
# 因为p2实例并没有绑定get_grade
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
给一个实例动态添加方法并不常见,直接在class中定义要更直观。
举例
由于属性可以是普通的值对象,如 str,int 等,也可以是方法,还可以是函数,大家看看下面代码的运行结果,请想一想 p1.get_grade 为什么是函数而不是方法:
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
self.get_grade = lambda: 'A'
p1 = Person('Bob', 90)
print p1.get_grade
print p1.get_grade()
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象:
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
return 'A'
p1 = Person('Bob', 90)
print p1.get_grade
# => <bound method Person.get_grade of <__main__.Person object at 0x109e58510>>
print p1.get_grade()
# => A
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
也就是说,p1.get_grade 返回的是一个函数对象,但这个函数是一个绑定到实例的函数,p1.get_grade() 才是方法调用。
因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType() 把一个函数变为一个方法:
import types
def fn_get_grade(self):
if self.score >= 80:
return 'A'
if self.score >= 60:
return 'B'
return 'C'
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
p1 = Person('Bob', 90)
p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
print p1.get_grade()
# => A
p2 = Person('Alice', 65)
print p2.get_grade()
# ERROR: AttributeError: 'Person' object has no attribute 'get_grade'
# 因为p2实例并没有绑定get_grade
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
给一个实例动态添加方法并不常见,直接在class中定义要更直观。
举例
由于属性可以是普通的值对象,如 str,int 等,也可以是方法,还可以是函数,大家看看下面代码的运行结果,请想一想 p1.get_grade 为什么是函数而不是方法:
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
self.get_grade = lambda: 'A'
p1 = Person('Bob', 90)
print p1.get_grade
print p1.get_grade()
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
直接把 lambda 函数赋值给 self.get_grade 和绑定方法有所不同,函数调用不需要传入 self,但是方法调用需要传入 self。
宁波眼部精雕http://www.biopls.net/Project/list-10-1.shtml
阅读全文
0 0
- Python进阶(十二)-浅谈python中的方法
- Python进阶(十二)-浅谈python中的方法
- 浅谈python 中的新老类,方法以及函数
- Python进阶(四)-浅谈Python闭包
- Python进阶(五)-浅谈python匿名函数
- Python进阶:Python魔法方法
- Python 进阶特殊方法
- python进阶----魔术方法
- Python进阶(十三)-浅谈sorted 函数应用
- python进阶 python中的高阶函数
- python爬虫进阶(十二):自动摘要及正文抽取
- 浅谈Python中的yield表达式
- 浅谈Python中的“析构”函数
- 浅谈Python中的 property属性
- 浅谈Python中的装饰器
- Python学习系列十二:序列的方法
- Python的学习(二十二)---Python中的对象复制
- Python进阶
- Oracle 11G 虚拟列 Virtual Column
- 数据结构实验之求二叉树后序遍历和层次遍历
- 如何使用脚本批量创建虚拟机(上)
- 写给一名软件测试工程师
- UDP --02--UDP广播数据
- Python进阶(十二)-浅谈python中的方法
- 理解分布式一致性协议:二、三阶段提交
- Elasticsearch 5.x head插件安装指南 及问题
- C++内存布局(下)
- C#使用Log4net输出日志
- TWaver可视化编辑器(一)电信网管编辑器
- SparkStreaming读取kafka数据进行反序列化以及mapPartition优化实例
- Android Studio Facebook 第三方登录并上传360全景图片
- 欧拉函数概念与应用拓展