Python面向对象基础
理解面向对象(Object Oriented)
-
面向对象是一种抽象化的编程思想,很多编程语言中都有的一种思想。
-
面向过程编程(Procedure Oriented),把实现某个特定目的分为若干个步骤,分别抽象出这些步骤,先定出框架再分别细化实现,是一种自上而下的思想。
-
而面向对象编程,则抽象化实现该目的的过程中出现的事物整体,将其定义为类,类可以创建对象。通过对象可以访问该事物整体的属性和方法。需要先设计准备好各种事物(类和对象),再对事物进行组织调用,实现特定功能,是一种自下而上的思想。
例如:洗⾐服
思考:有⼏种途径可以完成洗⾐服?
答: ⼿洗 和 机洗。
⼿洗:找盆 - 放⽔ - 加洗⾐粉 - 浸泡 - 搓洗 - 拧⼲⽔ - 倒⽔ - 漂洗N次 - 拧⼲ - 晾晒。(面向过程)
机洗:打开洗⾐机 - 放⾐服 - 加洗⾐粉 - 按下开始按钮 - 晾晒。(面向对象)
思考:对⽐两种洗⾐服途径,可以发现什么?
答:机洗更简单
思考:机洗,只需要找到⼀台洗⾐机,加⼊简单操作就可以完成洗⾐服的⼯作,⽽不需要关⼼洗⾐机内部发⽣了什么事情
-
⾯向对象编程,就是抽象出⼀个个事物,对外界来说,事物是直接使⽤的,不⽤去关心内部的情况。可以有效实现代码复用。
类(class)和对象(object)
思考:洗衣机洗衣服描述过程中,洗衣机其实就是一个事物,即对象,洗衣机对象是从哪来的呢?
答:洗衣机是由工厂工人制作出来。
思考:工厂工人怎么制作出的洗衣机?
答:工人根据设计师设计的功能图纸制作洗衣机。
总结:图纸 → 洗衣机 → 洗衣服。
-
在面向对象编程过程中,有两个重要组成部分:
类
和对象
。 -
类和对象的关系:用类去创建(实例化)一个对象
-
类(图纸) → \rightarrow → 对象(洗衣机) → \rightarrow → 调用属性/方法(洗衣服)
理解类和对象
类
- 类是对一系列具有相同特征和行为的事物的统称,是一个抽象的概念,不是真实存在的事物。
- 特征即是
属性
(attribute),表现为该类具有的各种变量 - 行为即是
方法
(method),表现为该类具有的各种函数
- 类就像是制造洗衣机时用到的图纸,也就是说类是用来创建对象的。
- 一个类可以创建多个对象。
对象
- 对象是根据类创建出来的真实存在的事物,例如:洗衣机。
- 对象是类的实例化,具有类的属性和方法,但不同对象的属性的值可以不同。方法可以随时调用。
注意:开发中,先有类,再有对象。
面向对象的实现
定义类
语法
class className():
代码块
注意:类名
className
要满足标识符命名规则,一般遵循大驼峰命名习惯。
如:
class Person():
"""定义人类"""
定义类的方法
语法
class className():
def methodName(self,arguments):
代码块
- 方法的本质是函数,故语法同函数类似。
self
指的是调用该方法的对象,理论上可以换成任意标识符,但self
是人们的常规习惯。实例化出一个对象后,该对象调用自己的方法,self
就被指定为该对象本身,不需要额外传入。
如:
class Person():
"""定义人类"""
def speak(self):
"""定义Person类的speak方法"""
print("歪比巴卜")
创建对象
- 对象又名实例。
- 根据类创建完对象后,对象具有了与类相同的属性和方法。
语法
objectName = className()
如:
myself=Person()
print(myself)
#<__main__.Person object at 0x000001B0A102B5E0>
注意:创建对象的过程也叫实例化对象。
使用对象的方法
- 使用对象之前必须先创建对象
语法
objectName.methodName(arguments)
- 与函数调用类似,只不过用
.
指定了调用函数的是哪个对象
如:
myself=Person()
myself.speak()
#歪比巴卜
属性的操作
- 属性即是特征,比如:洗衣机的宽度、高度、重量…
- 操作属性时,可将属性当成变量。不过需要通过
.
指定是谁的属性。
类外面操作属性
语法
className/objectName.attribute = value #添加/修改
className/objectName.attribute #访问
- 如果
attribute
不存在就添加;存在就修改值为value
- 修改类的属性后,以后根据该类创建的对象的属性一开始都被设置为新值。
- 修改对象的属性并不会影响类的属性。
如:
Person.height=167
Person.weight=62
print(f'人类平均身高:{Person.height}cm')
print(f'人类平均身高:{Person.weight}kg')
myself=Person()
myself.height=163
myself.weight=48
print(f'我的身高:{myself.height}cm')
print(f'我的体重:{myself.weight}kg')
"""
人类平均身高:167cm
人类平均身高:62kg
我的身高:163cm
我的体重:48kg
"""
类里面操作属性
语法
class className():
#最外层
attribute = value #添加/修改
attribute #访问
#任意位置
self.attribute=value #修改
self.attribute #访问
如:
class Person():
height=167
weight=62
def growup(self):
print("一年过去了...")
self.height+=1
self.weight+=5
def showInfo(self):
print(f"我的身高:{self.height}")
print(f"我的体重:{self.weight}")
myself=Person()
myself.showInfo()
myself.growup()
myself.showInfo()
"""
我的身高:167
我的体重:62
一年过去了...
我的身高:168
我的体重:67
"""
魔法方法(magic method)
- 在Python中,形如
__xx__()
的函数叫做魔法方法,指的是一些具有特殊功能的函数。
init() 构造函数
思考:根据Person
类创建的对象的身高和体重一开始都是167cm,62kg.但每个人的身高体重是各不相同的。能不能在创建一个具体的人对象的同时,把他的身高体重设置为现实中的值呢?
答:理应如此。__init__()
的作用就是在创建一个个对象的同时初始化他们的属性为各自对应的值。
语法
class className():
def __init__(self,var1,var2...):
self.attribute1=var1
self.attribute2=var2
...
className(value1,value2...) #创建对象的同时给属性赋值
- 创建对象时,
__init__
方法会被自动调用 self
代指调用改方法的对象。在创建对象时,不需要手动传入。
如:
class Person():
def __init__(self,name,height,weight):
self.name=name
self.height=height
self.weight=weight
def showInfo(self):
print(f"姓名:{self.name}")
print(f"身高:{self.height}")
print(f"体重:{self.weight}")
ZhangSan=Person("张三",180,60)
ZhangSan.showInfo()
"""
姓名:张三
身高:180
体重:60
"""
str() 打印函数
语法
class className():
def __str__(self):
...
return thePrintStr
- 在
print
对象时,Python解释器会自动调用__str__
方法,并打印__str__
方法的返回值 - 如果不写,则默认打印对象所属的类和地址。
如:
class Person():
def __init__(self,name,height,weight):
self.name=name
self.height=height
self.weight=weight
def __str__(self):
thePrintStr=f"姓名:{self.name}\n"
thePrintStr+=f"身高:{self.height}\n"
thePrintStr+=f"体重:{self.weight}"
return thePrintStr
ZhangSan=Person("张三",180,60)
print(ZhangSan)
"""
姓名:张三
身高:180
体重:60
"""
del() 析构函数
语法
class className():
def __del__(self):
代码块
- 当删除对象时,python解释器会自动调用
__del__()
方法。
如:
class Person():
def __init__(self,name,height,weight):
self.name=name
self.height=height
self.weight=weight
def __del__(self):
print(f"{self.name}坠入法网")
ZhangSan=Person("张三",180,60)
del(ZhangSan)
#张三坠入法网