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

Posted ucas_python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于python进阶三(面向对象编程基础)3-3 python中定义实例方法的主要内容,如果未能解决你的问题,请参考以下文章

python进阶三(面向对象编程基础)3-1 python中创建类属型

Python基础-第七天-面向对象编程进阶和Socket编程简介

进击的Python第七章:Python的高级应用面向对象编程进阶

Python基础-week06 面向对象编程进阶

python - 面向对象编程基础知识 (进阶)

进阶学Python:Python面向对象基础!