面向对象
基本的介绍
面向对象是一个编程思想(写代码的套路)
编程思想:
1.面向过程
2.面向对象
以上两种都属于写代码的套路(方法),最终目的都是为了将代码书写出来,只不过过程和思考方法不太一样
面向过程:
关注的是 具体步骤的实现,所有的功能都自己书写
亲力亲为
定义一个个函数,最终按照顺序调用函数
面向对象:
关注的是结果,谁(对象)能帮我做这件事
偷懒
找一个对象(),让对象去做
类和对象
面向对象的核心思想:找一个对象去帮我们处理事情
在程序代码中 对象是由 类 创建的
类和对象,是面向对象编程思想非常重要的两个概念
类:抽象的概念,对多个 特征和行为相同或者相似事物的统称
泛指的(指代多个,而不是具体的一个)
对象:具体存在的一个事物,看得见摸得着的
特指的(指代一个)
举例
苹果 —> 类
红苹果 —> 类
张三嘴例正在吃的那个苹果 —>对象
类的组成
- 1.类名(给这过个事物起一个名字,在代码中,满足大驼峰命名法(每个单词的首字母大写))
- 2.属性(事物的特征,即有什么,一般文字中的名词)
- 3.方法(事物的行为,即做什么事,一般是动词)
类的抽象
类的抽象,其实就是找到 类的类名,属性,方法
需求1:
小明今年18岁,身高1.75,每天早上跑完步,回去吃东西
小美今年17岁,身高1.65,小美不跑步,小美喜欢吃东西
类名:人类(Person,People)
属性:名字(name), 年龄(age),身高(height)
方法:跑步(run),吃东西(eat)
需求2:
一只黄颜色的狗狗叫大黄
看见生人汪汪叫
看见家人摇尾巴
类名:狗类(Dog)
属性:颜色(color)
名字(name)
方法:汪汪叫(bark) 摇尾巴(shake)
面向代码的步骤
1.定义类,在定义类之前先设计类
2.创建对象,使用第一步定义的类创建对象
3.通过对象调用方法
面向对象基本代码的书写
1.定义类
先定义简单的类,不包含属性,在Python中定义类需要使用关键字class
方法:方法的本质是在类中定义的函数,只不过,第一个参数是self
class 类名:
# 在缩进中书写的内容,都是类中的代码
def 方法名(self): # 就是一个方法
pass
2.创建对象
创建对象是使用 类名() 进行创建,即
类名() # 创建一个对象,这个对象在后续不能使用
# 创建的对象想要在后续的代码中继续使用,需要使用一个变量,将这个对象保存起来
变量 = 类名() # 这个变量中保存的是对象的地址,一般可以称为一个变量的对象
# 一个类可以创建多个独享,只要出现 类名() 就是创建一个对象,每个对象的地址是不一样的。
3.调用方法
对象.方法名()
如:列表.sort()
列表.append()
#1.定义类
# 需求:小猫爱吃鱼,小猫要喝水
# 类名:猫类(Cat)
# 属性:暂无
# 方法:吃鱼(eat),喝水(drink)
class Cat:
def eat(self):
print("小猫爱吃鱼....")
def drink(self):
print("小猫要喝水....")
#2.创建对象
blue_cat = Cat()
#3.通过对象调用类中的方法
blue_cat.eat()
blue_cat.drink()
self的说明
class Cat:
def eat(self):
print("小猫爱吃鱼....")
1.从函数的语法上将,self是形参,就可以是任意的变量名,只不过我们习惯性将这个形参写作self
2.self是普通的形参,但是在调用的时候没有传递实参值,原因是python解释器在执行代码的时候,自动的将调用这个方法的对象传递给了self,即self的本质是对象
3.验证,只需要确定通过哪个对象调用,对象和引用和self引用是一致的
4.self 是函数中的局部变量,直接穿点的对象是全局变量
class Cat:
def eat(self):
print(f'{id(self)},self') #35583648,self
print("小猫爱吃鱼....")
blue_cat = Cat()
print(f'{id(blue_cat)},blue_cat') #35583648,blue_cat
blue_cat.eat()
- 对象的属性操作
添加属性
对象.属性名 = 属性值
、
类内部添加
在内部方法中,self是对象
self.属性名= 属性值
在类中添加属性一般写作 __init__方法中
类外部添加
对象.属性名= 属性值 # 一般不使用
- 获取属性
对象.属性名
类内部
在内部方法中,self是对象
self.属性名
类外部
对象.属性名 #一般很少使用
‘’’
# 类外部添加属性名
class Cat:
def eat(self):
print(f'{id(self)},self') #35583648,self
print(f"小猫{self.name}爱吃鱼....")
blue_cat = Cat()
print(f'{id(blue_cat)},blue_cat') #35583648,blue_cat
blue_cat.name="蓝猫"
blue_cat.eat()
black_cat = Cat()
print(f'{id(black_cat)},black_cat')
black_cat.name = '黑猫'
black_cat.eat()
私有和公有
1.在python中定义的方法和属性,可以添加访问控制权限(即在什么地方可以使用这个属性和方法)
2.访问控制权限分为两种,公有权限,私有权限
3.公有权限
直接书写的方法和属性,都是公有的
公有的方法和属性,看可以在任意地方访问和使用
- 私有权限
在 类内部,属性名或者方法名,前边加上两个__,这个属性或者方法,就是私有的
私有的方法和属性,只能在当前类的内部使用
5.什么时候定义私有
某个属性或者方法,不详在类外部被访问和使用,就将其定义为私有即可
测试中,一般不怎么使用,直接公有即可
开发中,会根据需求文档,确定什么作为私有
# 案例
'''
定义一个Person类,属性name ,age(私有)
'''
class Person:
def __init__(self,name,age):
self.name = name #姓名
# self.age = age #公有 年龄
self.__age = age #私有 年龄
def __str__(self):
return f'名字:{self.name},年龄:{self.__age}'
xm = Person('小明',18)
print(xm)
# xm.age = 20
# print(xm)
魔法方法
python 中有一类方法,以两个下划线开头,量噶尔下划线结尾,并且在满足某个条件的情况下,会自动调用,这类方法称为魔法方法
- __init__方法
1.什么情况下自动调用
创建对象之后会自动调用
2.有什么用,用在哪
1.给对象添加属性的,(初始化方法,构造方法)
2.某些代码,在每次创建对象之后,都要执行,就可以将这行代码写在__init__方法中
3.书写的注意事项
1.不要写错了
2.如果init方法中,存在除了self以外的参数,在创建对此昂的时候必须传参
# 猫类 属性 name,age ,show_info(输出属性信息)
# __init__ 不带参数
class Cat:
# 定义添加属性的方法
def __init__(self): # 这个方法是创建对象之后调用
self.name = '蓝猫' # 给对象添加name属性
self.age=2 # 给独享添加age属性
def show_info(self):
print(f'小猫的名字是:{self.name},年龄是:{self.age}')
# 创建对象,不要在自己类缩进中创建
bluecat = Cat()
bluecat.show_info()
# __init__带参数
class Cat:
def __init__(self,name,age) :
self.name =name
self.age = age
def show_info(self):
print(f'小猫的名字是:{self.name},年龄是:{self.age}')
black_cat = Cat('黑猫',5)
black_cat.show_info()
- __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 __str__(self):
# 方法必须返回一个字符串,只要是字符串就行
return f'小猫的名字是:{self.name},年龄是:{self.age}'
blue_cat = Cat('蓝猫',2)
print(blue_cat)
black_cat = Cat('黑猫',3)
print(black_cat)
- __del__方法
__init__方法,创建对象之后,会自动调用 (构造方法)
__del__方法,对象被删除销毁时,自动调用的(遗言,处理后事)(析构方法) 调用场景 1.程序代码运行结束,所有对象都被销毁
直接使用del删除对象(如果对象有多个名字(多个对象引用一个对象),需要把所有的对象都删除才行)
class Demo:
def __init__(self,name):
self.name = name
print(f'我是__init__,{self.name}被调用了')
def __del__(self):
print(f'{self.name} 没了,给它处理后事...')
Demo('a')
a= Demo('a')
del a # 删除 销毁 对象
b = Demo('b')
print('代码运行结束')
案例
需求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}公斤'
def eat(self):
print(f'{self.name}大餐一顿, 体重增加了')
self.weight += 1
def run(self):
print(f'{self.name}跑步5Km,体重减少了')
self.weight-=0.5
per = Person('小明',75.0)
print(per)
per.run()
print(per)
per.eat()
print(per)
需求2:
1.房子(House) 有户型,总面积和家具名称列表
新房子没有任何的家具
2.家具(HouseItem) 有名字和占地面积,其中
席梦思(bed) 占地 4 平米
衣柜(chest) 占地 4 平米
餐桌(table) 占地 1.5 平米
3.将以上三件家具添加到房子中
4.打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
剩余面积
1.在创建房子对象时,定义一个剩余面积的属性,初始值和总面积相等
2.当调用add_item方法,向房间添加家具是,让剩余面积-=家具面积
类名:房子类 House
属性:户型 name ,总面积 area ,
剩余面积 free_area = total_are _家具面积
家具名称列表 item_list=[]
方法:init,str
添加家具方法 add_item
def add_item(self,item): #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.free_area =area# 剩余面积
self.item_list=[] # 家具列表
def add_item(self,item): # item 表示的家具的对象
# 判断房子的剩余面积(self.free_area)和家具的占地面积(item.area)
# self.表示的是房子对象,缺少一个家具对象使用传参解决
if self.free_area>item.area:
# 添加家具 --> 向列表中添加数据
self.item_list.append(item.name)
# 修改剩余面积
self.free_area-=item.area
print(f'{item.name}添加成功')
else:
print(f'剩余面积不足,{item.name}添加成功')
def __str__(self):
return f"户型:{self.name},总面积:{self.total_area}平米,剩余面积:{self.free_area}平米,家具列表:{self.item_list}"
# 创建家具对象
bed = HouseItem('席梦思',4)
chest = HouseItem('衣柜',4)
table = HouseItem('餐桌',1.5)
# 创建房子对象
house = House('三室一厅',150)
# 添加床
house.add_item(bed)
print(house)
# 添加衣柜
house.add_item(chest)
print(house)
# 添加桌子
house.add_item(table)
print(house)
案例3
需求:某Web项目登录页面包含:用户名,密码,验证码,登录按钮和登录的方法
书写代码实现以上功能,登录方法使用print输出即可
类名:LoginPage
属性:用户名 username ,密码 password,验证码 code ,登录按钮 button
方法:登录(login) init
class LoginPage:
def __init__(self,username,password,code,button):
self.username = username
self.password = password
self.code = code
self.btn = button
def login(self):
print(f'1.输入用户名:{self.username}')
print(f'2.输入密码:{self.password}')
print(f'3.输入验证码:{self.code}')
print(f'4.点击按钮:{self.btn}')
login = LoginPage('admin','123456','8888','登录')
login.login()