Python进阶(十二)-浅谈python中的方法
2017-03-17 17:20
176 查看
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
也就是说,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
给一个实例动态添加方法并不常见,直接在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()
直接把 lambda 函数赋值给 self.get_grade 和绑定方法有所不同,函数调用不需要传入 self,但是方法调用需要传入 self。
相关文章推荐
- Python进阶(十二)-浅谈python中的方法
- [Python入门及进阶笔记]Python-魔术方法小结(方法运算符重载)
- 从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
- 浅谈python类属性的访问、设置和删除方法
- Python 进阶_OOP 面向对象编程_静态方法和类方法
- Python 进阶_OOP 面向对象编程_实例属性和方法
- 重构方法进阶(十二):代码常用重构方法(临时变量内联化&以查询取代临时变量)
- 浅谈Python类的__getitem__和__setitem__特殊方法
- 浅谈python字符串方法的简单使用
- 浅谈python字符串方法的简单使用
- python 之浅谈接口的定义和抽象类以及抽象方法
- 从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
- python进阶教程之函数参数的多种传递方法
- 浅谈python类属性的访问、设置和删除方法
- [Python进阶-5]类的特殊方法
- Python学习系列十二:序列的方法
- python进阶教程之函数参数的多种传递方法
- 浅谈Python中copy()方法的使用
- 小甲鱼python视频弟十二讲(关于字符串的方法及注释下)
- python浅谈正则的常用方法