python进阶三(面向对象编程基础)【3-3 python中定义实例方法】

python中定义实例方法

一个实例的私有属性就是以__开头的属性,无法被外部访问,那这些属性定义有什么用?

虽然私有属性无法从外部访问,但是,从类的内部是可以访问的。除了可以定义实例的属性外,还可以定义实例的方法。

实例的方法就是在类中定义的函数它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的:

1 class Person(object):
2 
3     def __init__(self, name):
4         self.__name = name
5 
6     def get_name(self):
7         return self.__name

get_name(self) 就是一个实例方法,它的第一个参数是self。__init__(self, name)其实也可看做是一个特殊的实例方法。

调用实例方法必须在实例上调用:

p1 = Person('Bob')
print p1.get_name()  # self不需要显式传入
# => Bob

在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。

任务

请给 Person 类增加一个私有属性 __score,表示分数,再增加一个实例方法 get_grade(),能根据 __score 的值分别返回 A-优秀, B-及格, C-不及格三档。

 1 class Person(object):
 2 
 3     def __init__(self, name, score):
 4         self.name = name
 5         self.__score = score
 6 
 7     def get_grade(self):#一个判断成绩的实例方法,只接收一个参数self
 8         if self.__score >= 80:
 9             return 'A'
10         if self.__score >= 60:
11             return 'B'
12    
13         return 'C'
14 
15 p1 = Person('Bob', 90)#调用类的方法
16 p2 = Person('Alice', 65)
17 p3 = Person('Tim', 48)
18 
19 print p1.get_grade()#调用类中的实例私有属性的方法
20 print p2.get_grade()
21 print p3.get_grade()

python中方法也是属性

我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象:

 1 class Person(object):
 2     def __init__(self, name, score):
 3         self.name = name
 4         self.score = score
 5     def get_grade(self):
 6         return 'A'
 7 
 8 p1 = Person('Bob', 90)
 9 print p1.get_grade
10 # => <bound method Person.get_grade of <__main__.Person object at 0x109e58510>>
11 print p1.get_grade()
12 # => A

也就是说,p1.get_grade 返回的是一个函数对象,但这个函数是一个绑定到实例的函数,p1.get_grade() 才是方法调用

因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType() 把一个函数变为一个方法:

 1 import types
 2 def fn_get_grade(self):
 3     if self.score >= 80:
 4         return 'A'
 5     if self.score >= 60:
 6         return 'B'
 7     return 'C'
 8 
 9 class Person(object):
10     def __init__(self, name, score):
11         self.name = name
12         self.score = score
13 
14 p1 = Person('Bob', 90)
15 p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
16 print p1.get_grade()
17 # => A
18 p2 = Person('Alice', 65)
19 print p2.get_grade()
20 # ERROR: AttributeError: 'Person' object has no attribute 'get_grade'
21 # 因为p2实例并没有绑定get_grade

猜你喜欢

转载自www.cnblogs.com/ucasljq/p/11624784.html