⾯向对象编程概念(Python版)
⾯向对象编程
什么是⾯向对象?
1. ⾯向对象(Object oriented Programming, OOP)编程的思想主要是针对⼤型软件设计⽽来的。⾯向对象编程使程序的扩展性更
强,可读性更好,使得编程可以像搭积⽊⼀样简单。
2. ⾯向对象编程将从数据和操作数据相关的⽅法封装到对象中,组织代码和数据的⽅式更加贴近⼈的思维,从⽽⼤⼤提⾼了编程的效
率。
3. Python完全采⽤了⾯向对象的思想,是真正⾯向对象的编程语⾔,完全直齿⾯向对象的基本功能,例如:继承,多态,封装等。
4. Python中,⼀切皆对象。之前学习的数据类型,函数等,都是对象。
5. Python⽀持⾯向过程,⾯向对象,函数式编程等多种编程范式。
⾯向对象和⾯向过程区别
6. ⾯向过程(Procedure Oriented)思维
⾯向过程编程更加关注的是“程序的逻辑流程”,是⼀种“执⾏者”思维,适合编写⼩规模的程序。
⾯向过程思想思考问题时,我们⾸先思考“怎么按步骤实现?”并将步骤对应成⽅法,最终完成。这个适合简单任务,不需要过多协作的情况下。例如,如何开车?
1,发动汽车;2,挂挡;3,踩油门;4,启动
⾯向过程适合简单,不需要协作的⾷物。但是思考⽐较复杂的问题,⽐如“如何造车?”时,就会发现,⽆法简单的罗列出所有步骤,因为这些步骤之间涉及很密集的协作过程。因此,⾯向对象思想应运⽽⽣。
7. ⾯向对象(Object Oriented)思维
⾯向对象更加关注的是“软件中对象之间的关系”,是⼀种“设计者”思维,适合编写⼤规模的程序。
⾯向对象思想更加契合⼈的思维模式。我们⾸先思考的是“怎么设计这个事物”,⽐如思考造车,我们就会⾸先思考“车怎么设计?”,⽽不是“怎么按步骤造车?”的问题。这就是思维⽅式的转变。
8. ⾯向对象⽅式思考造车,发现车由以下对象组成:
1,轮胎
2,发动机
3,车壳
4,座椅
5,挡风玻璃
为了便于协作,我们轮胎⼚完成制造轮胎的步骤,发动机⼚完成制造发动机的步骤;这样,⼤家可以同时进⾏车的制造,最终进⾏组装,⼤⼤提⾼了效率。但是,具体到轮胎⼚的⼀个流⽔线操作,仍然是有步骤的,还是离不开⾯向过程思想。
因此,⾯向对象可以帮助我们从宏观上把握,从整体上分析整个系统。但是具体到实现部分的微观操作(⼀个个⽅法),仍然需要⾯向过程的思路去处理。
千万不要把⾯向过程和⾯向对象对⽴起来,它们是相辅相成的!
9. ⾯向对象思考⽅式
遇到复杂问题,先从问题中寻名词(⾯向过程更多的是动词),然后确⽴这些名词哪些可以作为类,再根据问题需求确定的类的属性和⽅法,确定类之间的关系。
对象的进化
随着编程⾯临的问题越来越复杂,编程语⾔本⾝也在进化,从主要处理简单数据开始,随着数据变多,进化出了“数组”;数据结构变复杂,进化出了“结构体”;处理数据的⽅式和逻辑变复杂,进化出了“对象”。
1,简单数据
像1,2,50这些数字,可以看作是简单数据。最初的计算机编程,都是像这样的数字。
2,数组
将同类型的数据放到⼀起,⽐如,整数类型数据[1,2,3,50],浮点类型数据[10,2, 32,5],字符串型数组[“a”, “cc”]
3,结构体
将不同类型的数据放到⼀起,为C语⾔中的数据结构。⽐如:
struct resume{
int age;
char name[10];
double salary;
};
4,对象
将不同类型的数据、⽅法(也叫函数)放到⼀起,就是对象。⽐如:
class Student:
company ="SXT"#类的属性
count =0#类的属性
def__init__(self, name, score):#类的⽅法,包含⽅法的具体动作
self.name = name
self.socre = score
def say_score(self):
print("我的公司是:"Studentpany)
print(self.name,"的分数是:",self.socre)
⾯向对象三⼤特征介绍
Python是⾯向对象的语⾔,也⽀持⾯向对象编程的三⼤特性:继承,封装(隐藏),多态。
封装(隐藏)
隐藏对象的属性和实现细节(⽅法),之对外提供必要的⽅法。相当于将“细节包装起来”,之对外暴露“相关调⽤⽅法”。
通过前⾯学习到的“私有属性、私有⽅法”的⽅式,实现“封装”。Python追求简洁的语法,没有严格的语法级别的“访问控制符”,更多的是⼀块程序员⾃觉实现。
⽐如,我们创建⼀个“⼿机”类,作为消费者,我们不需要掌握所有⼿机的原理,因为设计者隐藏了不必要的细节,我们只需要了解怎么使⽤⼿机。
继承
继承可以让⼦类具有⽗类的特征,提⾼了代码的重⽤性
从设计上是⼀种增量进化,原有⽗类设计不变的情况下,可以增加新的功能,或者改进已有的算法
多态
多态是指同⼀个⽅法调⽤由于对象不同会产⽣不同的⾏为,⽣活中这样的例⼦⽐⽐皆是:同样是休息⽅法,⼈不⽤休息⽅式不⽤。甲休息是睡觉,⼄休息是玩游戏。
类的定义
如何理解类和对象的关系?
以造房⼦为例,造房⼦需要以图纸为准,这个“图纸”就是类;⽽根据图纸造出来的实体房⼦,就是对象。
通过类定义数据类型的属性(数据)和⽅法(⾏为),也就是说,“类将⾏为和状态打包在⼀起”
对象是类的具体实体,⼀般称为“类的实例”。类看做“图纸”,对象就是根据这个“图纸”建造出的“实体房⼦”。
从⼀个类创建对象时,每个对象回共享这个类的⾏为(类中定义的⽅法),但会有⾃⼰的属性值(不共享状态)。更具体⼀点,”⽅法代码共享,属性数据不共享“。
Python中,⼀切皆对象。类也称为“类对象”,类的实例也称为“实例对象”。
定义类的语法格式如下:
class 类名:
类体
要点:
1.类名必须符合“标识符“原则;⼀般规定,⾸字母⼤写,多个单词使⽤”驼峰原则“。
2.类体中可以定义属性和⽅法。
3.属性⽤来描述数据,⽅法(函数)⽤来描述数据的相关操作。
⽰例:
class Student:
def__init__(self,name,score):
self.name = name
self.score = score
def say_score(self):
print(self.name, ‘的分数是:’, self.score)
s1 = Student('张三',80)#实例对象名为s1,
s1 = Student(“张三”,80),这句的意思,为调⽤构造⽅法,即对应类中的__init__,括号中为参数。注意,self为创建的实例对象的地址,调⽤构造⽅法后⾃动将参数传给self。self.name为Student的属性之⼀(⾃⼰定义),⽤于储存传⼊的参数name,score同理。
构造函数__init__()
类是抽象的,也称为”对象的模板“。通过这个模板,创建类的实例对象,才能使⽤类定义的功能。
Python的对象包括三个部分:id(identity,识别码)、type(对象类型)、value(对象的值)。
进⼀步的认识,⼀个Python对象包含以下部分:
1.id(identity,识别码)
3.value(对象的值)
(1)属性(attribute)
(2)⽅法(method)
创建对象,需要定义构造函数__init__⽅法。构造⽅法⽤于执⾏”实例对象的初始化⼯作“,即对象创建后,初始化当前对象的相关属性,⽆返回值。
init__的要点如下:
1.名称固定,必须为__init。
2.第⼀个参数固定,必须为self。self指的就是创建好的实例对象。
3.构造函数通常⽤来初始化实例对象的实例属性,以下代码就是初始化实例属性:name和score。
def__init__(self,name,score):
self.name = name
self.score = score
4.通过”类名(参数列表)“来调⽤构造函数。调⽤后,将创建好的对象返回给相应的变量。例如:
s1 = Student(“张三”, 80)。s1就是实体化的对象,根据参数顺序传⼊了name 和score的值,并储存于s1的内存中。
5.__init__⽅法:初始化创建好的对象,初始化指的是”给实例属性赋值“
6.__new__⽅法:⽤于创建对象,但我们⼀般⽆需重定义该⽅法。注:这⼀⽅法默认调⽤,⽆需再写⼀次。
实例属性、⽅法
实例属性
实例属性即所创建的实例对象的属性,也称为”实例变量“。它的使⽤有如下⼏个要点:
1.实例属性⼀般在__init__()⽅法中通过如下代码定义:
self.实例属性名 = 初始值
2.在本类的其他实例⽅法中,也是通过self进⾏访问。:
self.实例属性名
3.创建实例对象后,通过实例对象进⾏访问:
obj = 类名()#创建对象,调⽤__init__初始化属性
obj.实例属性名 = 值 #可以给已有属性赋值,也可以新加属性。(新加的属性为⼦类独有,创建新的⼦类时不继承)
实例⽅法
实例⽅法是从术语实例对象的⽅法。实例⽅法的定义格式如下:
def ⽅法名(self,[形参列表]):
函数体
⽅法的调⽤格式如下:
实例对象.⽅法名([实参列表])
注意:
1.定义实例⽅法时,第⼀个参数必须为self。和前⾯⼀样,self指当前的实例对象。
2.调⽤实例⽅法时,不需要也不能给self传参,self由解释器⾃动传参。
函数和⽅法的区别:
1.都是⽤来完成⼀个功能的语句块,本质⼀样。
2.⽅法调⽤时,通过对象来调⽤。⽅法从属于特定实例对象,普通函数没有这个特点。
3.直观上看,⽅法定义时需要传递self,函数不需要。
类对象
在类定义格式中,”class 类名:“。实际上,当解释器执⾏class语句时,就会创建⼀个类对象。
class Student
pass#空语句
print(type(Student))
print(id(Student))
Stu2 = Student
s2 = Stu2('Tom',80)
以上过程中,Stu2 = Student这句代码,意为以Student类为模板,创建⼀个名为Stu2的类,其属性和⽅法与引⽤的类⼀致。类属性和类⽅法
类属性
类属性是从属于”类对象“的属性,也称为”类变量“。由于类属性从属于类对象,可以被所有实例对象共享。
类属性的定义⽅法:
class 类名:
类变量名 = 初始值
在类中或者类的外⾯,我们可以通过:”类名.类变量名“来读写
⽰例:类属性的使⽤测试
class Student:
company ="SXT"#类属性
count =0#类属性
def__init__(self,name, score):
self.name = name #实例属性
self.score = score #实例属性
def say_score(self):
print('我的公司是:', Studentpany)
print(self.name,'的分数是', self.score)
s1 = Student('张三',80)
s1.say_score()
print('⼀共创建{0}个对象'.unt})
类⽅法
类⽅法是从属于”类对象“的⽅法。类⽅法通过装饰器@classmethod来定义,格式如下:
@classmethod
def 类⽅法名(cls, [形参列表]):
编程先学c语言还是python函数体
要点如下:
1.@classmethod必须位于⽅法上⾯⼀⾏
2.第⼀个cls必须有;cls值的就是”类对象“本⾝
3.调⽤类⽅法格式:”类名.类⽅法名(参数列表)“。参数列表中,不需要也不能给cls传参。
4.类⽅法中访问实例属性和实例⽅法会导致错误。
5.⼦类继承⽗类⽅法时,传⼊cls是⼦类对象,⽽⾮⽗类对象
⽰例:类⽅法使⽤测试
class Student:
company ="SXT"
@classmethod
def PrintCompany(cls):
print(clspany)
Student.PrintCompany()
静态⽅法
Python中允许定义与”类对象“⽆关的⽅法,称为”静态⽅法“
”静态⽅法“和在模块中定义普通函数没有区别,只不过”静态⽅法“放到了”类的名字空间⾥⾯“,需要通过”类调⽤“。静态⽅法通过修饰器@staticmethod定义,格式如下:
@staticmethod
def 静态⽅法名([形参列表])
函数体
要点如下:
1.@staticmethod必须位于⽅法上⾯⼀栏。
2.调⽤静态⽅法格式:”类名.静态⽅法名(参数列表)“
3.静态⽅法中访问实例属性和实例⽅法会导致错误
⽰例:静态⽅法使⽤测试
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论