面向对象(一)
来源:互联网 发布:js中的prop 编辑:程序博客网 时间:2024/06/03 01:41
<span style="font-family:FangSong_GB2312;font-size:18px;"><span style="font-size:18px;"><span style="background-color: rgb(255, 255, 51);">面向过程:根据业务逻辑从上到下写垒代码函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可面向对象:对函数进行分类和封装,让开发“更快更好更强...”面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用类 是一个模板,模板中包装了多个“函数”供使用对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数面向对象三大特性:封装、继承和多态问题一:什么样的代码才是面向对象?答:从简单来说,如果程序中的所有功能都是用 类 和 对象 来实现,那么就是面向对象编程了。问题二:函数式编程 和 面向对象 如何选择?分别在什么情况下使用?答:须知:对于 C# 和 Java 程序员来说不存在这个问题,因为该两门语言只支持面向对象编程(不支持函数式编程)。而对于 Python 和 PHP 等语言却同时支持两种编程方式,且函数式编程能完成的操作,面向对象都可以实现;而面向对象的能完成的操作,函数式编程不行(函数式编程无法实现面向对象的封装功能)。所以,一般在Python开发中,全部使用面向对象 面向对象和函数式混合使用面向对象的应用场景:1.多函数需使用共同的值,如:数据库的增、删、改、查操作都需要连接数据库字符串、主机名、用户名和密码2.需要创建多个事物,每个事物属性个数相同,但是值的需求如:张三、李四、杨五,他们都有姓名、年龄、血型,但其都是不相同。即:属性个数相同,但值不相同<p><strong>问题三:类和对象在内存中是如何保存?</strong></p><p>答:<em><span style="color:#888888;">类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图:</span></em></p> </span>
面向对象技术简介
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 实例变量:定义在方法中的变量,只作用于当前实例的类。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法
类定义
语法格式如下<span style="font-family:FangSong_GB2312;"><span style="font-size:18px;">class ClassName: <statement-1> . . . <statement-N></span></span>
类中的函数第一个参数必须是self(详细见:类的三大特性之封装)
类中定义的函数叫做 “方法”
面向对象三大特性:
一、封装
很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 __init__() 的特殊方法(构造方法),像下面这样:
<span style="font-family:FangSong_GB2312;font-size:18px;">def __init__(self): self.data = []</span>
self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1
当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2
第二步:从某处调用被封装的内容
调用被封装的内容时,有两种情况:
- 通过对象直接调用
- 通过self间接调用
1、通过对象直接调用被封装的内容
上图展示了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式可以如此调用被封装的内容:对象.属性名
<span style="font-family:FangSong_GB2312;font-size:18px;">class Foo: def __init__(self, name, age): self.name = name self.age = age obj1 = Foo('wupeiqi', 18)print obj1.name # 直接调用obj1对象的name属性print obj1.age # 直接调用obj1对象的age属性 obj2 = Foo('alex', 73)print obj2.name # 直接调用obj2对象的name属性print obj2.age # 直接调用obj2对象的age属性</span>
2.通过self间接调用被封装的内容
执行类中的方法时,需要通过self间接调用被封装的内容
<span style="font-family:FangSong_GB2312;font-size:18px;">class Foo: def __init__(self, name, age): self.name = name self.age = age def detail(self): print self.name print self.age obj1 = Foo('wupeiqi', 18)obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18 obj2 = Foo('alex', 73)obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78</span>
案例:
<span style="font-family:FangSong_GB2312;font-size:18px;">练习一:在终端输出如下信息 小明,10岁,男,上山去砍柴 小明,10岁,男,开车去东北 小明,10岁,男,最爱大保健 老李,90岁,男,上山去砍柴 老李,90岁,男,开车去东北 老李,90岁,男,最爱大保健class Foo: def __init__(self, name, age ,gender): self.name = name self.age = age self.gender = gender def kanchai(self): print "%s,%s岁,%s,上山去砍柴" %(self.name, self.age, self.gender) def qudongbei(self): print "%s,%s岁,%s,开车去东北" %(self.name, self.age, self.gender) def dabaojian(self): print "%s,%s岁,%s,最爱大保健" %(self.name, self.age, self.gender)xiaoming = Foo('小明', 10, '男')xiaoming.kanchai()xiaoming.qudongbei()xiaoming.dabaojian()laoli = Foo('老李', 90, '男')laoli.kanchai()laoli.qudongbei()laoli.dabaojian()</span>类的方法:
<span style="font-family:FangSong_GB2312;font-size:18px;">#!/usr/bin/python3#类定义class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age))# 实例化类p = people('runoob',10,30)p.speak()</span>
二、继承
动物:吃、喝、拉、撒
猫:喵喵叫(猫继承动物的功能)
狗:汪汪叫(狗继承动物的功能)
伪代码:class 动物: def 吃(self): # do something def 喝(self): # do something def 拉(self): # do something def 撒(self): # do something# 在类后面括号中写入另外一个类名,表示当前类继承另外一个类class 猫(动物): def 喵喵叫(self): print '喵喵叫' # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类class 狗(动物): def 汪汪叫(self): print '喵喵叫'
实例:
<span style="font-family:FangSong_GB2312;font-size:18px;">#!/usr/bin/python3#类定义class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age))#单继承示例class student(people): grade = '' def __init__(self,n,a,w,g): #调用父类的构函 people.__init__(self,n,a,w) self.grade = g #覆写父类的方法 def speak(self): print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))s = student('ken',10,60,3)s.speak()</span>
执行以上程序输出结果为:
ken 说: 我 10 岁了,我在读 3 年级
多继承
python2.7多继承具体描述---戳这里@@@@@@@@@@@@@@@@@@@@@@@
python3.0多继承是新式类
而且还有一个特点:
方法重写
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,实例如下:
#!/usr/bin/python3class Parent: # 定义父类 def myMethod(self): print ('调用父类方法')class Child(Parent): # 定义子类 def myMethod(self): print ('调用子类方法')c = Child() # 子类实例c.myMethod() # 子类调用重写方法
执行以上程序输出结果为:
调用子类方法
三、多态
Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。
0 0
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- (一)面向对象
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- 面向对象(一)
- Mysql存储引擎中InnoDB与Myisam的区别
- 欢迎使用CSDN-markdown编辑器
- Rectangle Area
- python的文件操作说明
- Java内存管理机制-1
- 面向对象(一)
- Eclipse Android项目开发完成以后就要将android项目文件打包成apk文件
- ion-content 滚动到底部会遮住一部分视图的解决办法
- 从acitivity之间的数据传递谈起
- 流量牵引在抗DDOS中的应用
- android5.1 蓝牙上电流程
- ng-model指令
- golang map 用原生range遍历不能保证顺序输出
- Impala Catalog Server StateStore 端口被占 无法启动问题