案例实现
需求:小猫爱吃鱼,小猫要喝水
类名:猫类 Cat
属性:暂无
方法:吃鱼(eat)喝水(drink)
class Cat:
def eat(self): # self自动出现,不用管
print('小猫爱吃鱼...')
def drink(self):
print('小猫要喝水...')
# 2、创建对象
blue_cat = Cat()
# 3、通过对象调用类中的方法
blue_cat.eat() # 小猫爱吃鱼...
blue_cat.drink() # 小猫要喝水...
# 创建对象
black_cat =Cat()
black_cat.eat() # 小猫爱吃鱼...
black_cat.drink() # 小猫要喝水..
- self的说明
class Cat:
def eat(self): # self自动出现,不用管
print(f'{id(self)},self')
print('小猫爱吃鱼...')
# 2、创建对象
blue_cat = Cat()
print(f'{id(blue_cat)}, blue_cat')
# 3、通过对象调用类中的方法
blue_cat.eat() # blue_cat 对象调用eat方法,解释器就会将blue_cat对象传给 self
print('_'*30)
# 创建对象
black_cat =Cat()
print(f'{id(black_cat)}, black_cat')
black_cat.eat() # black_cat对象调用eat方法,解释器就会将black_cat对象传给 self
1、函数的语法上讲,self是形参,就可以是任意的变量名,习惯上将这个形参写作self
2、self 是普通的形参,但是在调用的时候没有传递实参值,因为python解释器在执行代码的时候,自动的将调用这个方法的对象传递给了 self ,即self的本质是对象
3、验证,只需要确定,通过哪个对象调用,对象的引用和self 的引用是一样的
4、self 是函数中的局部变量,直接创建的对象是全局变量
对象的属性操作
添加属性
对象.属性名 = 属性值
-
类内部添加
在内部方法中,self是对象
self.属性名 = 属性值
在类中添加属性一般写作 __init__方法 -
类外部添加
对象.属性名 = 属性值 # 一般不使用
获取属性
对象.属性名
- 类内部
在内部方法中,self是对象
self.属性名 - 类外部
对象.属性名 # 一般不使用
class Cat:
def eat(self): # self自动出现,不用管
print(f'{id(self)},self')
print(f'小猫{self.name}爱吃鱼...')
# 2、创建对象
blue_cat = Cat()
print(f'{id(blue_cat)}, blue_cat')
# 给蓝猫添加 name属性
blue_cat.name = '蓝猫'
# 3、通过对象调用类中的方法
blue_cat.eat() # blue_cat 对象调用eat方法,解释器就会将blue_cat对象传给 self
print('_'*30)
# 创建对象
black_cat =Cat()
black_cat.name = '黑猫'
print(f'{id(black_cat)}, black_cat')
black_cat.eat() # black_cat对象调用eat方法,解释器就会将black_cat对象传给 self
__init__方法
1、什么情况下自动调用
创建对象之后会自动调用
2、有什么用,用在哪
1)给对象添加属性的(初始化方法,构造方法)
2)某些代码,在每次创建对象之后,都要执行,就可以将这行代码写在__init__方法
3、书写注意事项
如果init方法中,存在出了self之外的参数,在创建对象的时候必须传参
class Cat:
# 定义添加属性的方法
def __init__(self): # 这个方法是创建对象之后调用
self.name = '蓝猫' # 给对象添加name属性
self.age = 2 # 给对象添加age属性
# 验证是否被调用
print('我是__init__,我被调用了')
# 输出属性信息
def show_into(self):
print(f'小猫的名字是{self.name},年龄是{self.age}')
# 创建对象,不要在自己类缩进中创建
# Cat() # 创建对象,会输出
blue_cat = Cat() # 创建对象,会输出
blue = blue_cat # 不是创建对象,不会输出
blue.show_into()
# 创建黑猫
black_cat =Cat() # 创建对象
black_cat.show_into()
class Cat:
# 定义添加属性的方法
def __init__(self,name,age): # 这个方法是创建对象之后调用
self.name = name # 给对象添加name属性
self.age = age # 给对象添加age属性
# 输出属性信息
def show_into(self):
print(f'小猫的名字是{self.name},年龄是{self.age}')
# 创建对象,不要在自己类缩进中创建
# Cat() # 创建对象,会输出
blue_cat = Cat('蓝猫',2) # 创建对象,会输出
blue = blue_cat # 不是创建对象,不会输出
blue.show_into()
# 创建黑猫
black_cat =Cat('黑猫',3) # 创建对象
black_cat.show_into()
__str__方法
1、什么情况下自动调用
使用print(对象)打印对象的时候,会自动调用
2、有什么用,用在哪
1)在这个方法中一般书写对象的属性信息,即打印对象的时候想要查看什么信息,在这个方法中进行定义的
2)如果类中没有定义__str__方法,print(对象),默认输出对象的引用地址
3、书写注意事项
这个方法必须返回一个字符串
class Cat:
# 定义添加属性的方法
def __init__(self,name,age): # 这个方法是创建对象之后调用
self.name = name # 给对象添加name属性
self.age = age # 给对象添加age属性
# 输出属性信息
def show_into(self):
print(f'小猫的名字是{self.name},年龄是{self.age}')
def __str__(self):
# 必须返回一个字符串 ,只要是字符串就行
return f'小猫的名字是{self.name},年龄是{self.age}'
# 创建对象,不要在自己类缩进中创建
# Cat() # 创建对象,会输出
blue_cat = Cat('蓝猫',2) # 创建对象,会输出
print(blue_cat)
# 创建黑猫
black_cat =Cat('黑猫',3) # 创建对象
print(black_cat)
__del__方法
__init__方法,创建对象之后,会自动调用 (构造方法)
__del__方法,对象被删除销毁时,会自动调用的(处理后事)(析构方法)
1、调用场景,程序代码运行结束,所有对象都被销毁
2、调用场景,直接使用del删除对象(如果对象有多个名字(多个对象引用一个对象),需要把所有的对象都删除才行)
class Demo:
def __init__(self,name):
print('我是__init__,我被调用了')
self.name = name
def __del__(self):
print(f'{self.name}没了,给它处理后事...')
# Demo('a') # a没了,给它处理后事...
a=Demo('a') # a没了,给它处理后事...
b=Demo('b') # b没了,给它处理后事...
del a # 删除销毁,对象 程序未运行结束,先销毁,处理a,再打印运行代码结束,最后是b
print('代码运行结束') # 先执行代码运行结束,才会执行a,b
'''
代码运行结束
a没了,给它处理后事...
b没了,给它处理后事...
# 加了del a
a没了,给它处理后事...
代码运行结束
b没了,给它处理后事...
'''
案例
- 需求1:
1、小明体重75.0公斤
2、小明每次跑步会减肥0.5公斤
3、小明每次吃东西体重增加1公斤
类名:人类 Person
属性:姓名 name,体重 weight
方法:
跑步 run
吃东西 eat
添加属性 __init__
属性信息 __str__
class Person:
def __init__(self,name,weight):
self.name = name
self.weight = weight
def __str__(self):
return f"姓名:{self.name},体重:{self.weight}kg"
def run(self):
print(f"{self.name}跑步5km,体重减少了")
# 减体重,即修改属性
self.weight -= 0.5
def eat(self):
print(f"{self.name}吃了1次东西,体重增加了")
# 修改体重
self.weight +=1
xm = Person('小明',75.0)
print(xm)
xm.run()
print(xm)
xm.eat()
print(xm)
-
需求2
1、房子(House)有户型、总面积和家具名称列表
新房子没有任何的家具
2、家具(Houseltem)有名字和占地面积,其中
席梦思(bed)占地4平米
衣柜(chest)占地2平米
餐桌(table)占地1.5平米
3、将以上三件家具添加到房子中
4、打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表剩余面积
1、在创建房子对象时,定义一个剩余面积的属性,初始值和总面积相等
2、当调用add_item方法,向房间添加家具时,让剩余面积 -=家具面积
类名:房子类 House
属性:户型 name ,总面积 total_area,剩余面积 free_area = total_area
家具名称列表 item_list = []
方法:__init__ ,__str__
添加家具方法:
def add_item(self,item): #
先判断房子的剩余面积和总面积的关系
修改房子的剩余面积
修改房子的家具名称列表
类名:家具类 HouseItem
属性:户型 name ,总面积 area
方法:__init__ ,__str__
# 定义家具类
class HouseItem:
def __init__(self, name, area):
self.name =name
self.area = area
def __str__(self):
return f"家具名字{self.name},占地面积{self.area}平米"
# 定义房子类
class House:
def __init__(self,name,area):
self.name=name # 户型
self.total_area = area # 总面积
self.fre_area = area # 剩余面积
self.item_list=[] # 家具名称的列表
def __str__(self):
return f"户型:{self.name},总面积:{self.total_area},剩余面积:{self.total_area}平米,家具名称列表:{self.item_list}"
def add_item(self, item):
# 先判断房子的剩余面积(self.free_area)和家具的占地面积(item.area)的关系
# self 表示的 房子的对象,缺少一个家具对象使用传参解决
if self.fre_area > item.area:
# 添加数据
self.item_list.append(item.name)
# 修改房子的剩余面积
self.fre_area-=item.area
print(f"{item.name} 添加成功")
else:
print('剩余面积不足,换个大房子吧')
# 修改房子的家具名称列表
# 创建家具对象
bed = HouseItem('席梦思',4)
chest = HouseItem('衣柜',2)
table = HouseItem('餐桌',1.5)
print(bed)
print(chest)
print(table)
# 创建房子对象
house = House('三室一厅',150)
print(house)
# 添加 床
house.add_item(bed)
print(house)
- 需求3
类名:学生类 Student
属性:姓名 name,年龄age
方法:吃饭 eat,睡觉 sleep, 过年 year ,__str__ ,__init__
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"姓名:{self.name},年龄:{self.age}岁"
def eat(self):
print(f"{self.name}要吃饭")
def sleep(self):
print(f"{self.name}要睡觉")
def year(self):
self.age+=1
xm = Student('小明',18)
xh = Student('小红',17)
print(xm)
print(xh)
xm.eat()
xm.sleep()
xm.year()
print(xm)
xh.eat()
xh.sleep()
xh.year()
print(xh)
- 需求4
class computer:
def __init__(self,brand,price):
self.brand =brand
self.price =price
def play_movie(self,movie):
print(f"{self.brand}播放电影 {movie}")
mi = computer('小米',1000)
mac = computer('mac',2000)
mi.play_movie('葫芦娃')
mac.play_movie('变形金刚')