python之面向对象介绍一
1. 面向对象简介
1.1 面向过程
(1)定义:面向过程指将我们的程序分解为⼀个⼀个步骤,通过对每个步骤的抽象来完成程序。
(2)特点:这种编程方式符号人类的思维,编写起来比较容易,但编写方式往往只适用于⼀个功能,如果要实现别的功能,往往复用性比较低。
(3)举例:
- 妈妈穿衣服穿鞋出门
- 妈妈骑上电动车
- 妈妈到超市门口放好电动车
- 妈妈买西瓜
- 妈妈结账
- 妈妈骑电动车回家
- 到家孩子吃西瓜
这个过程就一步一步慢慢来,有逻辑地以一种阐述故事情节的方式展开。
1.2 面向对象
(1)定义:Object Oriented Programming(简称OOP)。OOP把对象当成一个程序的基本单元,一个对象包含了数据和操作数据的函数(简单理解就是语言中的所有操作都是通过对象来进行的,即包含对象的对象)。
(2)特点:关注的是对象,而不注重过程,对于面向对象⼀切皆对象。这种编码⽅式比较容易阅读,并且易于维护,容易复用。但是编写的过程中不太符合常规的思维,编写相对麻烦。
(3)典型代表为:类(class):其用来描述具有相同的属性和方法的对象的集合。其中,“属性”就等同于“变量”,方法就等同于“函数”。
(4)举例:
面向过程的例子转为面向对象的例子为:
孩子妈妈给孩⼦买瓜来解决
面向对象的编程思想,将所有功能统⼀保存到对应的对象中,要使用某个功能,直接找到对应的对象即可。即妈妈做的事情、妈妈的特点,归到妈妈这个类中(做的事情,就相当于类的方法(函数),妈妈的特点就相当于类的属性(变量))
(4)典型代表为:类(class):其用来描述具有相同的属性和方法的对象的集合。其中,“属性”就等同于“变量”,方法就等同于“函数”。
2.类的初步介绍(class)
2.1 类的引入
我们目前学习的都是 Python 的内置对象,但是内置对象并不都能满足我们的需求,所以我们在开发中经常要自定义一些对象。
(1)类的简介
- 类简单理解就是一张图纸 在程序中我们需要根据类来创建对象
- 我们也称对象是类的实例(instance)
- 如果多个对象是通过一个类创建的,我们称这些对象是一类对象
'''
类的简介:
类简单理解就是一张图纸 在程序中我们需要根据类来创建对象
我们也称对象是类的实例(instance)
如果多个对象是通过一个类创建的,我们称这些对象是一类对象
'''
a = 1 # int、float、str、bool、list都是类 ,而a是类的实例化,或者说是对象(instance)
print(a,type(a)) # 1 <class 'int'> 通过这个就可以看出
print(isinstance(a,int)) #或者 通过isinstance() 来检查一个对象是否是另一个类的实例 True
(2)自建类的需要
但是python中内置对象有时候不满足我们的需求,如我们要设置一个“人类”的对象,里面包含着这类“人”的特点(属性)、行为(方法),这个时候,我们就需要自己创建一个类,来存储它的特点和行为。
如小学生(primary_student):特点:年龄7-12岁,行为:喜欢写完作业玩游戏这个时候我们就可以创建一个小学生类(student)
2.2类的介绍
(1)定义
通过上面,我们大致对类有个了解。类是用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。而对象是类的实例。
类和对象都是对现实生活中事物的抽象
实际上所有的事物都有两部分构成:
1.特征(属性)
2.行为(方法)
(2)类的命名:自定义的类,类的名字要使用大写字母开头,使用大驼峰命名法
(3)类的语法:
# class 类名([父类]):
# 代码块
class Primary_Student:
age = '7-12岁'
(4)类的类型:
- 类也是一个对象 用来创建对象的对象
- 类是type类型的对象 定义类实际上就是定义了一个type类型的对象
print(Primary_Student,type(Primary_Student)) # <class '__main__.Primary_Student'> <class 'type'>
# 类也是一个对象 用来创建对象的对象
# 类是type类型的对象 定义类实际上就是定义了一个type类型的对象
2.3 类的实例化
定义类之后,可以将其实例化,如:
John是一个小学生、Sarh是一个小学生、Claire是一个小学生
那么可以将其进行Primary_Student类的实例化,即作为Primary_Student类的对象
'''
定义类之后,可以将其实例化,如:
John是一个小学生、Sarh是一个小学生、Claire是一个小学生
那么可以将其进行Primary_Student类的实例化,即作为Primary_Student类的对象
'''
# 我们可以通过isinstance() 来检查一个对象是否是另一个类的实例
John = Primary_Student()
print(isinstance(John,Primary_Student)) # 结果:True
Sarh = Primary_Student()
print(isinstance(Sarh,Primary_Student)) # 结果:True
Claire = Primary_Student()
print(isinstance(Claire,Primary_Student)) # 结果:True
2.4 类的属性
属性等同于变量。类的实例化后就是对象,对象不仅可以创建属于自己的属性(变量),我们称之为私有属性,还可以引用所指向的类里面的属性(变量)。我们称之为公用属性。
(1)语法
语法:
对象.属性名 = 属性值
(2)类的公用属性
- 在类的代码块中,我们可以定义属性和方法(或者是变量和函数)
- 在类中我们定义的属性,将会成为所有实例的公共属性
- 所有实例都可以访问这些属性(变量)
class Primary_Student:
age = '7-12岁' # age为公共属性
(3)对象的私有属性
- 对象自身创建的变量。
- 类的对象既可以引用类的属性,也可以创建自己的属性。并且私有属性优先于公共属性
# 引用类的属性和方法(公共属性)
print(John.age) # 结果为7-12岁
print(Sarh.age) # 结果为7-12岁
print(Claire.age) # 结果为7-12岁
# 可以创建自己的属性,如创建自己的名字
John.name = 'John'
print(John.name) # 结果为John
Sarh.name = 'Sarh'
print(Sarh.name) # 结果为Sarh
Claire.name = 'Claire'
print(Claire.name) # 结果为Claire
(4)属性的寻找顺序
私有属性优先于公共属性
A 当我们调用一个对象的属性时,解析器会在当前对象中寻找是否含有该属性
B 如果有,则直接返回当前对象的属性值
C 如果没有呢,则去当前对象的类对象中去寻找,如果类对象中有则返回类对象中的属性值
D 如果类对象中没有,则报错
# 私有属性优先于公共属性
print(John.age) # 结果为7-12岁
John.age = '8岁' # 设置John对象的私有属性age
print(John.age) # 结果为8岁
2.5 类的方法
(1)定义
- 在类中也可以定义函数 类中定义的函数我们称之为方法
- 这些方法可以通过该类的实例来访问
(2)方法与函数的区别
- 如果函数调用 调用的时候有几个形参,就会传递几个实参
- 但是如果是方法调用,默认传递一个参数。方法中至少定义一个形参
- 方法调用的定义一个默认形参是为了声明是这个对象调用了函数,一般是用self
- 所以self是指对象,对象是谁,self就是谁
class LogisticStudent: #创建类
def Student(self):
print('this is an example.')
print(self,self.name,self.age)
chen = LogisticStudent()
chen.name = 'claire'
chen.age = '18'
chen.Student() #结果:
# this is an example.
# 打印出的是对象地址 <__main__.LogisticStudent object at 0x000002777AAEB348>
# 打印出对象的私有属性claire 18
print(chen) #打印出的是对象地址 <__main__.LogisticStudent object at 0x000002777AAEB348>
3.总结练习
'''
再创建一个Person类巩固如下内容:
(1)属性和方法的查找流程:对象私有属性优先于类的公共属性
(2)self是对象的代理
'''
class Person:
name = '蜘蛛侠'
def speak(self):
print(self)
print('你好我是%s'%self.name)
# print(a)
p1 = Person()
p2 = Person()
p1.name = '钢铁侠'
p2.name = '绿巨人'
p1.speak() # <__main__.Person object at 0x000001D83E0CE8C8> # 你好 我是钢铁侠
print(p1) # <__main__.Person object at 0x000001D83E0CE8C8>
p2.speak() # <__main__.Person object at 0x000001D83E0CE6C8> # 你好 我是绿巨人
print(p2) # <__main__.Person object at 0x000001D83E0CE6C8>