LCY.SEN

导航

 

面向对象编程:类,对象

面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

面向对象技术简介

  • 类(class):用来描述有相同属性和方法的对象的集合,它定义了集合中每个对象所共有的属性和方法。
  • 对象(object):类的实例

创建类和对象

1 class Person:
2        
3     def __init__(self,name,age):
4         self.name = name
5         self.age = age
6 
7     def talk(self,msg):
8         print("%s-talk:%s"%(self.name,self.msg))
9 obj = Person("alex","23")    
  • class 是关键字表示类,后边紧跟着类名"Person"
  • 创建对象obj = Person()->类名加括号(有参数,要传递构造方法的参数进去)
  • self是个什么东西呢?

self:python自动传递的参数,代表你实例的对象。通过self可以调用该对象的相应属性和方法。

  • 构造方法:"__init__(self,name,age)";只要创建对象,就会自动去执行该方法然后我就可以用对象直接访问:obj.name &obj.age
1 p_obj1 = Person("alex","23")
2 p_obj2 = Person("lcy","24")
3 print(p_obj1.name,p_obj1.age)# alex 23
4 print(p_obj2.name,p_obj2.age)# lcy 24

面向对象三大特性:封装、继承、多态

封装
  • 将内容封装到类中
  • 在从类中调用封装的方法或属性

Ex:

 1 class Person:
 2     
 3     def __init__(self,name,sex,age):
 4         self.name = name
 5         self.sex = sex
 6         self.age = age
 7     
 8     def show(self,obj):
 9         print(self.name,obj.name)
10 
11 
12 obj_1 = Person("sb","male",23)
13 obj_2 = Person("json","female",24)
14 
15 obj_1.show(obj_2) 
16 '''
17 打印:sb;json
18 '''
封装

注:在类中可以封装任意类型的数据

继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。

  • 单继承
  • 多继承
  1. 单继承
 1 class A:
 2     
 3     def show(self):
 4         print("A:show")
 5 
 6     def aa(self):
 7         print("A:aa")
 8 
 9 class B(A):
10     
11     def show(self):
12         print("B:show")
13 
14     def bb(self):
15         print("B:bb")
16 
17 class C(B):
18     
19     def show(self):
20         print("C:show")
21 
22     def cc(self):
23         print("C:cc")
24 
25 obj_c = C()
26 obj_c.show()  #优先调用自己的方法,如果自己没有,在去父类中找
27 obj_c.bb()

再看一个例子:

 1 class A:
 2 
 3     def __init__(self,name):
 4         self.name = name
 5 
 6     def show(self): 
 7         print(self.name)
 8 
 9 class B(A):
10 
11     def __init__(self,name):
12         self.name = name
13 
14 obj_a = A("alex")
15 obj_b = B("lcy")
16 obj_b.show() # show 会打印谁 是 lcy 还是 alex

想一想我们之前说过的self,这里是子类B对象obj_b调用父类A的show方法,那么self传递的肯定是obj_b 这个对象。所以打印的是obj_b.name = lcy;

  2. 多继承

举一个简单多继承(python3)

 1 class C0:
 2     def  f2(self0):
 3         print("C0-f2")
 4 
 5 class C1(C0):
 6     def f1(self):
 7         print("C1-f1")
 8 
 9 class C2:
10 
11     def f2(self):
12         print("C2-f2")
13 class C3(C1,C2):
14     def f3(self):
15         print("C3-f2")
16 
17 obj = C3() 
18 obj.f2()

我们看obj 调用f2应该是谁的方法呢?

按着继承顺序,寻找路径应该是C3->C1->C0->C2 (这个其中C2并不继承任何类)见图1

注意:如果C2继承C0,那么寻找路径就编程了C3->C1->C2->C0 见图2

图1

 

图二

在举一个看程序源码时候对象调用方法的一个执行顺序

 1 class C5:
 2     def forever(self):
 3         self.run()
 4 
 5     def run(self):
 6         print("C5-run")
 7 class C4(C5):
 8     def __init__(self):
 9         print("C4-init")
10 
11     def process(self):
12         pass
13 
14     def run(self):
15         print("C4-run")
16         self.process()
17 
18 class C3(C4):
19     def __init__(self):
20         print("C3-init")
21 
22 class C2:
23     def process(self):
24         print("C2-process")
25 
26 class C1(C2,C3):
27     pass
28 
29 obj = C1()
30 obj.forever()
31 '''
32 C3-init
33 C4-run
34 C2-process
35 '''

顺序图:首先C1()调用构造,寻找init方法路径 C1->C2->C3(找到了)->C4->C5

调用forever方法,寻找路径C1->C2->C3->C4->C5(找到了)

forever又执行了 self.run方法 继续寻找:C1->C2->C3->C4(找到了)->C5

run方法又执行了self.process()方法 继续寻找:C1->C2(找到了返回结果)->C3->C4->C5

     3. 多态

python不支持多态。

总结 

  • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
  • 类 是一个模板,模板中包装了多个“函数”供使用
  • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
  • 面向对象三大特性:封装、继承和多态

最重要的图示:类和对象是在内存中如何保存

 

posted on 2016-11-20 22:18  LCY.SEN  阅读(562)  评论(0编辑  收藏  举报