前言
最近在学习Python的面向对象编程,以前是没有接触过其它的面向对象编程的语言,因此学习这一部分是相当带劲的,这里也总结一下。
概述
- python支持多种编程范式:面向过程、面向对象、面向切面(装饰器部分)等。
- 面向过程:根据业务逻辑从上到下写垒代码
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
- 面向对象:对函数进行分类和封装,让开发“更快更好更强...”
OOP思想
- 面向对象的基本哲学:世界由具有各自运动规律和内部状态的对象组成,对象之间相互作用和通讯构成了世界。
- 唯一性,世界没有两片相同的树叶,同样的没有相同的对象。
- 分类性,分类是对现实世界的抽象。
- 三大特性:封装、继承和多态
面向对象的三大特性:
一、封装
封装,对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,即无法调用。
私有化:将类或函数中的某些属性限制在某个区域之内,外部无法调用。
Python中私有化的方法也比较简单,就是在准备私有化的属性(包括方法、数据)名字前面加双下划线。
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class ProtectMe( object ):
def __init__( self ):
self .me = "qiwsir"
self .__name = "kivi"
def __python( self ):
print ( "I love Python." )
def code( self ):
print9 "Which language do you like?" )
self .__python()
if __name__ = = "__main__" :
p = ProtectMe()
print (p.me)
print (p.__name)
#运行结果
qiwsir
Traceback (most recent call last):
File "21102.py" , line 21 , in <module>
print p.__name
AttributeError: 'ProtectMe' object has no attribute '__name'
|
说明:__name属性隐藏了,无法调用。
调用私有属性,可以使用property函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class ProtectMe( object ):
def __init__( self ):
self .me = "qiwsir"
self .__name = "kivi"
@property
def name( self ):
return self .__name
if __name__ = = "__main__" :
p = ProtectMe()
print (p.name)
#运行结果
kivi
|
所以,在使用面向对象的封装特性时,需要:
- 将内容封装到某处
- 从某处调用被封装的内容
第一步:将内容封装到某处
self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 )
时,self 等于 obj1
当执行 obj2 = Foo('alex', 78 )
时,self 等于 obj2
所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。
第二步:从某处调用被封装的内容
调用被封装的内容时,有两种情况:
- 通过对象直接调用
- 通过self间接调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Role( object ):
ac = None #类变量
def __init__( self ,name,role,weapon,life_value):
#初始化方法
self .name = name #实例变量(成员变量)
self .role = role
self .weapon = weapon
self .life_val = life_value
def buy_weapon( self ,weapon): #定义方法
#self:表示实例本身
self .weapon = weapon
# print("%s is buying [%s]" %(self.name,weapon))
#把一个抽象的类变成一个具体的对象的过程,叫实例化
p1 = Role( "sanjiang" , 'Police' , "B10" , 90 ) #实例
t1 = Role( "Chunyun" , 'Terrorist' , "B11" , 100 )
|
二、继承
继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
class SchoolMember( object ):
# member_nums = 0
def __init__( self ,name,age,sex):
self .name = name
self .age = age
self .sex = sex
# self.enroll()
def enroll( self ):
SchoolMember.member_nums + = 1
print ( "SchoolMember [%s] is enrolled!" % self .name)
def tell( self ):
print ( "Hello my name is [%s]" % self .name)
class Teacher(SchoolMember):
def __init__( self ,name,age,sex,course,salary): #重写父类的__init__方法
super (Teacher, self ).__init__(name,age,sex) #继承(新式类)
# SchoolMember.__init__(self,name,age,sex) #继承(旧式类)
self .course = course
self .salary = salary
def teaching( self ):
print ( "Teacher [%s] is teaching [%s]" % ( self .name, self .course))
class Student(SchoolMember):
def __init__( self ,name,age,sex,course,tuition):
super (Student, self ).__init__(name,age,sex)
self .course = course
self .tuition = tuition
def pay_tuition( self ):
print ( "ca,student [%s] paying tuition [%s] again" % ( self .name, self .tuition))
|
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
原文链接:http://www.cnblogs.com/yezl/p/5806841.html