面向对象编程:类,对象
面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
面向对象技术简介
- 类(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 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不支持多态。
总结
- 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用
- 类 是一个模板,模板中包装了多个“函数”供使用
- 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
- 面向对象三大特性:封装、继承和多态
最重要的图示:类和对象是在内存中如何保存