Python是⾯向对象的⾼级编程语⾔.
在Python中“⼀切都是对象”:数字、字符串、元组、列表、字典、集合等内置数据类型,以及函数、⽅法、类、模块都是对象。
在⾯向对象编程过程中,有两个重要组成部分:类 和 对象。
类是对⼀系列具有相同特征和⾏为的事物的统称,是⼀个抽象的概念,不是真实存在的事物,特征即是属性,⾏为即是⽅法。它让我们创建一个新类型的对象,并可以创建该类型的新实例。
对象是类创建出来的真实存在的事物,对象是类的实例。
1、定义类
Python 中类的定义使用 class 关键字,语法如下所示:
class 类名:
属性
...
方法
...
类名要满⾜标识符命名规则,同时遵循⼤驼峰命名习惯
比如定义一个类 Cat,如下所示:
class Cat:
color = 'red'
def __init__(self,cid):
self.cid = cid
def __run(self,speed):
print(f'cid是{self.cid}的猫,以{speed}的速度奔跑')
def runandrun(self,speed):
self.__run(speed)
print(f'cid是{self.cid}sss的猫,以{speed}的速度奔跑')
构造方法 init() 会在类实例化时自动调用。无论构造方法还是其他方法都需要将 self 作为第一个参数,它代表类的实例。
类创建好后,可以直接通过类名访问属性,格式为:类名.属性名。
print('color-->', Cat.color)
2、创建对象
创建对象也称类的实例化,比如通过 Cat 类创建对象,创建好对象后,可以使用它访问属性和调用方法。
语法:对象名 = 类名()
如下所示:
c= Cat('33')
c.run('50迈')
输出结果:
__cid是33的猫,以50迈的速度奔跑
3、 参数self
1)属性和⽅法
类中定义的属性和⽅法都是公共的,任何该类实例都可以访问
属性和⽅法的查找流程:调⽤⼀个对象的属性时,解析器会在当前的对象中寻找是否还有该属性,如果有,则直接返回当前的对象的属性值。如果没有,则去当前对象的类对象中去寻找,如果有则返回类对象的属性值。如果没有就报错。
类对象和实例对象中都可以保存属性(⽅法):
如果这个属性(⽅法)是所以的实例共享的,则应该将其保存到类对象中
如果这个属性(⽅法)是摸个实例独有的。则应该保存到实例对象中
⼀般情况下,属性保存到实例对象中 ⽽⽅法需要保存到类对象中
2) self
self在定义时需要定义,但是在调⽤时会⾃动传⼊。
self的名字并不是规定死的,但是最好还是按照约定是⽤self
self指向的是调⽤该函数的对象
# 定义类
class Washer():
def print_info(self):
# 类⾥⾯获取实例属性
print(f'haier1洗⾐机的宽度是{self.width}')
print(f'haier1洗⾐机的⾼度是{self.height}')
# 创建对象
haier1 = Washer()
# 添加实例属性
haier1.width = 500
haier1.height = 800
haier1.print_info()
4、 魔法⽅法
在Python中, xx() 的函数叫做魔法⽅法,指的是具有特殊功能的函数。
1)init() :初始化对象。
init() ⽅法,在创建⼀个对象时默认被调⽤,不需要⼿动调⽤
init(self) 中的self参数,不需要开发者传递,python解释器会⾃动把当前的对象引⽤传递过去。
例如:
class Washer():
def __init__(self):
# 添加实例属性
self.width = 500
self.height = 800
def print_info(self):
print(f'洗衣机的宽度是{self.width}')
print(f'洗衣机的高度是{self.height}')
haier = Washer()
haier.print_info()
带参数的init()
例如:
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height
def print_info(self):
print(f'洗⾐机的宽度是{self.width}')
print(f'洗⾐机的⾼度是{self.height}')
haier1 = Washer(10, 20)
haier1.print_info()
haier2 = Washer(30, 40)
haier2.print_info()
2)str() :当使⽤print输出对象的时候,默认打印对象的内存地址。如果类定义了 str ⽅法,那么就会打印从在这个⽅法中 return 的数据。
例如:
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height
def __str__(self):
return '这是海尔洗⾐机的说明书'
haier1 = Washer(10, 20)
# 这是海尔洗⾐机的说明书
print(haier1)
3)del():当删除对象时,python解释器也会默认调⽤ del() ⽅法
例如:
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height
def __del__(self):
print(f'{self}对象已经被删除')
haier1 = Washer(10, 20)
# <__main__.Washer object at 0x0000026118223278>对象已经被删除
del haier1
5、应用实例
实例1:烤地瓜
需求:
- 被烤的时间和对应的地⽠状态:
0-5分钟:⽣的
5-10分钟:半⽣不熟
10-15分钟:熟的
超过15分钟:烤糊了 - 添加的调料:
⽤户可以按⾃⼰的意愿添加调料
实现:
class SweetPotato():
def __init__(self):
#烤的时间
self.cook_time =0
# 地瓜状态
self.cook_status = '生的'
# 调料
self.condiments = []
def cook(self,time):
self.cook_time+=time
if self.cook_time < 5 :
self.cook_status = '生的'
elif 5<=self.cook_time<10:
self.cook_status ='半生不熟'
elif 10<=self.cook_time<15:
self.cook_status ='熟了'
elif self.cook_time >=15:
self.cook_status = '糊了'
def addCondiment(self,name):
self.condiments.append(name)
def __str__(self):
return f"烤地瓜的时间为{self.cook_time},地瓜的状态{self.cook_status},添加的作料是:{self.condiments}"
potato1 = SweetPotato()
potato1.cook(5)
potato1.addCondiment('椒盐')
print(potato1)
potato1.cook(6)
potato1.addCondiment('胡椒')
print(potato1)
输出结果:
烤地瓜的时间为5,地瓜的状态半生不熟,添加的作料是:['椒盐']
烤地瓜的时间为11,地瓜的状态熟了,添加的作料是:['椒盐', '胡椒']
实例2:搬家具
需求:将⼩于房⼦剩余⾯积的家具摆放到房⼦中
实现:
class Furniture():
def __init__(self,name,area):
#家具名称
self.name = name
# 家具占地面积
self.area = area
class Home():
def __init__(self,address,area):
# 家的地址
self.address = address
# 家的面积
self.area = area
# 家的剩余面积
self.free_area = area
# 家中已有家具列表
self.furnitures = []
def add_furniture(self,furniture):
if furniture.area <= self.free_area:
self.furnitures.append(furniture.name)
self.free_area-=furniture.area
else:
print("家具太大,放不下~")
def __str__(self):
return f"地址{self.address},面积为{self.area}的家里,搬进去的家具有{self.furnitures},剩余面积为{self.free_area}"
home = Home('北京',1000)
fur1 = Furniture('桌子',100)
home.add_furniture(fur1)
print(home)
fur2 = Furniture('床',901)
home.add_furniture(fur2)
print(home)
输出结果:
地址北京,面积为1000的家里,搬进去的家具有['桌子'],剩余面积为900
家具太大,放不下~
地址北京,面积为1000的家里,搬进去的家具有['桌子'],剩余面积为900
网友评论