面向对象编程python
面向对象编程是一种编程方式,此编程方式须要使用 “类” 和 “对象” 来实现,因此,面向对象编程其实就是对 “类” 和 “对象” 的使用。程序员
1 # 建立类 2 class Foo(object): #新式类(经典类 class Foo:) 3 4 def Bar(self): 5 6 print 'Bar' 7 8 def Hello(self, name): 9 10 print 'i am %s' %name 11 12 # 根据类Foo建立对象obj 13 14 obj = Foo() 15 16 obj.Bar() #执行Bar方法 17 18 obj.Hello('x54256') #执行Hello方法
面向对象3大特色:数据库
1、封装 编程
封装,顾名思义就是将内容封装到某个地方,之后再去调用被封装在某处的内容。ide
因此,在使用面向对象的封装特性时,须要:模块化
1 class Foo(object): 2 def __init__(self,name,age): #构造函数,根据类建立对象时(实例化)自动执行 3 self.name=name 4 self.age=age 5 6 def run(): 7 print("%s今年%s岁了。"%(self.name,self.age) 8 9 10 #实例化(就是将内容封装到某处) 11 #实际上alex和22被封装到了obj1中,x54256和21被封装到了obj2中 12 13 obj1=Foo('alex',22) 14 15 obj2=Foo('x54256',21) 16 17 18 #若要调用必须从obj1,obj2中调用封装的内容 19 20 print(obj1.name) 21 print(obj2.name) 22 23 #要从被封装的地方调用类中的函数 24 25 obj1.run() 26 obj2.run()
2、继承函数式编程
继承,面向对象中的继承和现实生活中的继承相同,即:子能够继承父的内容。函数
例如:post
猫能够:喵喵叫、吃、喝、拉、撒spa
狗能够:汪汪叫、吃、喝、拉、撒
若是咱们要分别为猫和狗建立一个类,那么就须要为 猫 和 狗 实现他们全部的功能,以下所示:
1 class 猫: 2 3 def 喵喵叫(self): 4 print '喵喵叫' 5 6 def 吃(self): 7 # do something 8 9 def 喝(self): 10 # do something 11 12 def 拉(self): 13 # do something 14 15 def 撒(self): 16 # do something 17 18 class 狗: 19 20 def 汪汪叫(self): 21 print '喵喵叫' 22 23 def 吃(self): 24 # do something 25 26 def 喝(self): 27 # do something 28 29 def 拉(self): 30 # do something 31 32 def 撒(self): 33 # do something 34 35 伪代码
上述代码不难看出,吃、喝、拉、撒是猫和狗都具备的功能,而咱们却分别的猫和狗的类中编写了两次。若是使用 继承 的思想,以下实现:
动物:吃、喝、拉、撒
猫:喵喵叫(猫继承动物的功能)
狗:汪汪叫(狗继承动物的功能)
1 class 动物: 2 3 def 吃(self): 4 # do something 5 6 def 喝(self): 7 # do something 8 9 def 拉(self): 10 # do something 11 12 def 撒(self): 13 # do something 14 15 # 在类后面括号中写入另一个类名,表示当前类继承另一个类 16 class 猫(动物): 17 18 def 喵喵叫(self): 19 print '喵喵叫' 20 21 # 在类后面括号中写入另一个类名,表示当前类继承另一个类 22 class 狗(动物): 23 24 def 汪汪叫(self): 25 print '喵喵叫' 26 27 伪代码
1 class Animal: 2 3 def eat(self): 4 print "%s 吃 " %self.name 5 6 def drink(self): 7 print "%s 喝 " %self.name 8 9 def shit(self): 10 print "%s 拉 " %self.name 11 12 def pee(self): 13 print "%s 撒 " %self.name 14 15 16 class Cat(Animal): 17 18 def __init__(self, name): 19 self.name = name 20 self.breed = '猫' 21 22 def cry(self): 23 print '喵喵叫' 24 25 class Dog(Animal): 26 27 def __init__(self, name): 28 self.name = name 29 self.breed = '狗' 30 31 def cry(self): 32 print '汪汪叫' 33 34 35 # ######### 执行 ######### 36 37 c1 = Cat('小白家的小黑猫') 38 c1.eat() 39 40 c2 = Cat('小黑的小白猫') 41 c2.drink() 42 43 d1 = Dog('胖子家的小瘦狗') 44 d1.eat()
3、多态
1 class Animal(object): 2 3 def __init__(self, name): # Constructor of the class 4 5 self.name = name 6 7 def talk(self): # Abstract method, defined by convention only 8 9 raise NotImplementedError("Subclass must implement abstract method") 10 11 class Cat(Animal): 12 13 def talk(self): 14 15 print('%s: 喵喵喵!' %self.name) 16 17 18 class Dog(Animal): 19 20 def talk(self): 21 22 print('%s: 汪!汪!汪!' %self.name) 23 24 25 def func(obj): #一个接口,多种形态 26 27 obj.talk() 28 29 30 c1 = Cat('小晴') 31 32 d1 = Dog('李磊') 33 34 35 func(c1) 36 37 func(d1)
领域模型
领域模型就是对需求所涉及的领域的一个建模,更通俗的讲法是业务模型。 参考百度百科领域模型定义以下: (http://baike.baidu.cn/view/757895.htm )
从这个定义咱们能够看出,领域模型有两个主要的做用:
领域域建模的方法就是“从用例中找名词”。 固然,找到名词后,为了可以更加符合面向对象的要求和特色,咱们还须要对这些名词进一步完善,这就 是接下来的步骤:加属性,连关系!
1.找名词
who : 学员、讲师、管理员
用例:
1. 管理员 建立了 北京 和 上海 两个校区
2. 管理员 建立了 Linux \ Python \ Go 3个课程
3. 管理员 建立了 北京校区的Python 16期, Go开发第一期,和上海校区的Linux 36期 班级
4. 管理员 建立了 北京校区的 学员 小晴 ,并将其 分配 在了 班级 python 16期
5. 管理员 建立了 讲师 Alex , 并将其分配 给了 班级 python 16期 和全栈脱产5期
6. 讲师 Alex 建立 了一条 python 16期的 上课纪录 Day6
7. 讲师 Alex 为Day6这节课 全部的学员 批了做业 ,小晴得了A, 李磊得了C-, 严帅得了B
8. 学员小晴 在 python 16 的 day6里 提交了做业
9. 学员李磊 查看了本身所报的全部课程
10 学员 李磊 在 查看了 本身在 py16期 的 成绩列表 ,而后自杀了
11. 学员小晴 跟 讲师 Alex 表白了
名词列表:
管理员、校区、课程、班级、上课纪录、做业、成绩、讲师、学员
2.加属性
3.连关系
有了类,也有了属性,接下来天然就是找出它们的关系了。
总结
以上就是本节对于面向对象初级知识的介绍,总结以下:
问答专区
问题一:什么样的代码才是面向对象?
答:从简单来讲,若是程序中的全部功能都是用 类 和 对象 来实现,那么就是面向对象编程了。
问题二:函数式编程 和 面向对象 如何选择?分别在什么状况下使用?
答:须知:对于 C# 和 Java 程序员来讲不存在这个问题,由于该两门语言只支持面向对象编程(不支持函数式编程)。而对于 Python 和 PHP 等语言却同时支持两种编程方式,且函数式编程能完成的操做,面向对象均可以实现;而面向对象的能完成的操做,函数式编程不行(函数式编程没法实现面向对象的封装功能)。
因此,通常在Python开发中,所有使用面向对象 或 面向对象和函数式混合使用
面向对象的应用场景:
1.多函数需使用共同的值,如:数据库的增、删、改、查操做都须要链接数据库字符串、主机名、用户名和密码
1 class SqlHelper: 2 3 def __init__(self, host, user, pwd): 4 5 self.host = host 6 self.user = user 7 self.pwd = pwd 8 9 def 增(self): 10 # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库链接 11 # do something 12 # 关闭数据库链接 13 14 def 删(self): 15 # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库链接 16 # do something 17 # 关闭数据库链接 18 19 def 改(self): 20 # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库链接 21 # do something 22 # 关闭数据库链接 23 24 def 查(self): 25 # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库链接 26 # do something 27 # 关闭数据库链接# do something
2.须要建立多个事物,每一个事物属性个数相同,可是值的需求
如:张3、李4、杨五,他们都有姓名、年龄、血型,但其都是不相同。即:属性个数相同,但值不相同
1 class Person: 2 3 def __init__(self, name ,age ,blood_type): 4 5 self.name = name 6 self.age = age 7 self.blood_type = blood_type 8 9 10 def detail(self): 11 temp = "i am %s, age %s , blood type %s " % (self.name, self.age, self.blood_type) 12 print temp 13 14 zhangsan = Person('张三', 18, 'A') 15 lisi = Person('李四', 73, 'AB') 16 yangwu = Person('杨五', 84, 'A')
问题三:类和对象在内存中是如何保存?
答:类以及类中的方法在内存中只有一份,而根据类建立的每个对象都在内存中须要存一份,大体以下图: