python中方法也是属性
2017-01-09 20:14
302 查看
我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象:
也就是说,p1.get_grade 返回的是一个函数对象,但这个函数是一个绑定到实例的函数,p1.get_grade() 才是方法调用。
因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType() 把一个函数变为一个方法:
给一个实例动态添加方法并不常见,直接在class中定义要更直观。
由于属性可以是普通的值对象,如 str,int 等,也可以是方法,还可以是函数,大家看看下面代码的运行结果,请想一想 p1.get_grade 为什么是函数而不是方法:
?不会了怎么办
直接把 lambda 函数赋值给 self.get_grade 和绑定方法有所不同,函数调用不需要传入 self,但是方法调用需要传入 self。
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_笔记14_创建类的实例(支持多属性),方法也是属性
- [Dynamic Language] Python 静态方法、类方法、属性
- python面向对象-属性和方法
- python学习笔记之七:魔法方法,属性
- python 魔法方法,属性,迭代
- python 魔法方法,属性,迭代
- Python类属性和类方法的一些差别(与C++和Java相比)
- Python实现动态添加类的属性或成员函数的解决方法
- python 方法属性(用户自定义方法,非内置方法)
- python 对象,属性的方法
- Python基础编程(九)魔法方法、属性和迭代器
- python特殊属性和方法的运用
- python创建只读属性对象的方法(ReadOnlyObject)
- python特殊属性和方法的运
- python保留属性和方法总结(转载)
- python特殊属性和方法的运用
- chapter9: python 类的方法,属性,迭代器(new[old]-type class,[un]bound method,super,protocol,property,iterators)
- 8、Python-方法、属性、迭代器
- Python属性和方法
- python基础教程_学习笔记11:魔法方法、属性和迭代器