一、理解面向对象
面向对象是⼀种抽象化的编程思想,很多编程语⾔中都有的⼀种思想。
- ⾯向对象就是将编程当成是⼀个事物,对外界来说,事物是直接使用的,不用去管他内部的情况。⽽编程就是设置事物能够做什么事。
- 在⾯向对象编程过程中,有两个重要组成部分:类 和 对象。
- 类和对象的关系:⽤类去创建⼀个对象。(实例化)
类是对⼀系列具有相同特征和行为的事物的统称,是⼀个抽象的概念。
- 特征即是属性
- 行为即是方法
类是⼀个抽象的概念,不是真实存在的事物,对象是类创建出来的真实存在的事物
二、面向对象实现方法
1、定义类:
2、创建对象:创建对象的过程也叫实例化对象。
# 定义people类
class People():
def person(self): # 定义实例方法
print("person startup")
# 创建对象
p1 = People()
# 验证
print(p1) # 打印对象
p1.person() #调用对象方法--对象.方法名()
输出:
<__main__.People object at 0x000001C54AE88288>
person startup
3、self指的是调用该方法的对象。
class People(): #定义类
def person(self):
print("i am People class")
print(self)
p1 = People() # 创建对象
print(p1)
print("-"*40)
p1.person() #对象调用方法
输出:
<__main__.People object at 0x0000026422AF8308>
----------------------------------------
i am People class
<__main__.People object at 0x0000026422AF8308> #self的内存地址与对象p1的内存地址相同,所以self是调用该函数的对象
4、一个类创建多个对象
- 一个类可以创建任意多个对象
- 每个对象是不同的对象,内存地址不同
# 需求:1,一个类创建多个对象,2,多个对象都调用函数的时候,self地址是否相同
class People():
def person(self):
print("i am coming")
print(self)
p1 = People()
p1.person()
p2 = People()
p2.person()
输出:
i am coming
<__main__.People object at 0x0000026C3D1E8288>
i am coming
<__main__.People object at 0x0000026C3D1EFE88>
5、添加对象属性
属性即是特征,对象属性既可以在类外⾯添加和获取,也能在类⾥面添加和获取。
5.1、在类外面添加属性
5.2、在类外面访问对象属性
class People():
def person(self):
print("i am coming")
p1 = People()
p1.height = 180
p1.weight = 170
print("p1的身高是{}cm,体重是{}斤。".format(p1.height, p1.weight))
输出:p1的身高是180cm,体重是170斤。
5.3、在类里面访问对象属性
里面:即class缩进的位置
class People():
def person(self):
print("i am coming")
def print_info(self):
print("p1的身高是{}cm,体重是{}斤。".format(self.height, self.weight))
p1 = People()
p1.height = 180
p1.weight = 170
p1.print_info()
输出:p1的身高是180cm,体重是170斤。
5.4 在类里面调用类方法
语法:self.方法名()
class People:
def person(self):
return "i am coming."
def info(self):
return "hi,"
def personinfo(self):
print(self.info(), self.person())
p1 = People()
p1.personinfo()
输出:
hi, i am coming
6、魔法方法:init()方法
在Python中, xx() 的函数叫做魔法方法,指的是具有特殊功能的函数。
思考:对象的宽度高度是与生俱来的属性,可不可以在创建过程中就赋予这些属性呢?
答:理应如此。
init() 方法的作用:初始化对象。
- init() 方法,在创建一个对象时默认被调用,不需要⼿动调用
- init(self) 中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
class People(): # 定义类
def __init__(self): # 定义init方法,初始化功能
self.height = 180 # 添加实例属性
self.weight = 170
def print_info(self): # 定义实例方法
print("身高是{}cm,体重是{}".format(self.height, self.weight)) # 在类里面访问实例属性
p1 = People()
p1.print_info()
输出:身高是180cm,体重是170
7、带参数的__init__()
思考:一个类创建多个对象,且不同的对象设置不同的初始化属性呢?
答:传参数。
class People():
def __init__(self, height, weight): # 定义init方法,初始化实例属性,方法里有两个形参,height形参,weight形参
self.height = height # self.height是实例的属性,height是形参
self.weight = weight # self.weight是实例的属性,weight是形参
def print_info(self): #定义实例方法
print("身高是{}cm,体重是{}斤。".format(self.height, self.weight))
# 此处的self.height是实例的属性,self.weight是实例的属性
p1 = People(180, 170) # 创建实例时传入实参
p1.print_info() # 调用实例方法
p2 = People(165, 100)
p2.print_info()
输出:
身高是180cm,体重是170斤。
身高是165cm,体重是100斤。
如果创建实例时不传参,报错:
8、魔法方法之__str__()
- 当使⽤print打印对象名不加括号的时候,默认打印对象的内存地址。
- 如果类定义了 str 方法,那么就会打印这个方法中 return 的数据。
- str()方法一般放的是解释说明的文字
- 注意:str()方法,用return关键字,后面写要返回的内容,调用时用print
class People():
def __init__(self, height, weight): # 定义init方法,初始化属性,方法里有两个形参
self.height = height # self.height是实例的属性,height是形参
self.weight = weight # self.weight是实例的属性,weight是形参
def print_info(self): #定义实例方法
print("身高是{}cm,体重是{}斤。".format(self.height, self.weight))
# 此处的self.height是实例的属性,self.weight是实例的属性
p1 = People(180, 170) # 创建实例时传入实参
print(p1)
输出:<__main__.People object at 0x0000020D3888FE88>
# 当使⽤print打印对象名不加括号的时候,默认打印对象的内存地址。
class People():
def __init__(self, height, weight): # 定义init方法,初始化属性,方法里有两个形参
self.height = height # self.height是实例的属性,height是形参
self.weight = weight # self.weight是实例的属性,weight是形参
def print_info(self): #定义实例方法
print("身高是{}cm,体重是{}斤。".format(self.height, self.weight))
# 此处的self.height是实例的属性,self.weight是实例的属性
def __str__(self):
return "这是__str__方法解释说明文字,类的说明,对象状态说明"
p1 = People(180, 170) # 创建实例时传入实参
print(p1)
输出:这是__str__方法解释说明文字,类的说明,对象状态说明
9、魔法方法之__del__()
- 当删除对象时,python解释器也会默认调用 del() 方法。
- 当没有手动删除对象时,只要程序自上而下运行结束会自动调用__del__方法,内存删除程序运行时的变量、类、对象等,释放内存
class People():
def __init__(self):
self.width = 300
def __del__(self):
print("was deleted!")
p1 = People()
输出:was deleted!
三、基础总结
思考参与这个需求的事物一共有哪些,划分出事物之后,对事物进行上归类,分出来多少个分类,就创建多少个类,再用类去创建对象。
魔法方法都不需要手工调用,当程序满足条件自动调用。
PS: source, bilibili