面向对象基础
- 理解什么是面向对象
- 类和对象的概念
- 添加和获取对象属性
- 魔术方法
理解面向对象
如何理解面向对象和面向过程之间的差别呢
例如:小明感到非常饿,想要吃饭
面向过程:出门去超市—买蔬菜–买肉—买米—回家—处理食物—煮饭—盛饭—进食
面向对象:点外卖
总结:面向对象就是将编程当成是一个事物,对外界来说,事物是直接使用的,不用去管它的内部情况。而编程就是设置事物能够做什么事。
类和对象
类的定义
类是对一系列具有相同特征和行为的事物的统称,是一个抽象的概念,并不是真实存在的事物
- 特征即是属性
- 行为即是方法
通俗来说:如果你需要去打篮球,那么你得需要一双篮球鞋,而篮球鞋就是你打球的时候需要的东西,因此可以说类是用来创建对象的
对象的定义
对象是类创建出来的真实存在的事物。
因此:开发中,应该是先有类,然后再有对象
面向对象的实现方法
语法
# class func(类名)():
# 对应代码
# pass
class func():
# 代码
pass
1,创建对象
此过程也叫做实例化对象
代码实现如下
class My_doing():
def do_work(self):
print("我正在写作业!")
def do_exercise(self):
print("我正在做运动!")
# 创建对象
demo = My_doing()
# 调用对象的实例化方法
demo.do_work()
demo.do_exercise()
# 在此不创建对象直接调用也可输出但一般建议先创建对象,然后在调用
# My_doing.do_work()
# My_doing.do_exercise()
self:是代表类的实例,类的方法与普通函数的一个特别的区别——它们必须有一个额外的第一个参数名称,按照惯例它的名称是self
添加和获取对象的属性
属性就是指例如一个人的身高,体重,长相…
对象属性既可以在类外面添加和获取,也能在类里面添加和获取
1,类外添加对象属性
语法
对象名.属性名 = 值
案例
class body_info():
def main(self):
pass
demo = body_info()
# 在类外定义我的身高,体重
demo.height = 185
demo.wight = 150
print("我的身高是:", demo.height)
print("我的体重是:", demo.wight)
2,类里面获取对象属性
语法
self.属性名
案例代码:
class body_info():
def main(self):
print("我的身高是:", self.height)
print("我的体重是:", self.weight)
demo = body_info()
# 定义我的身高,体重
demo.height = 185
demo.weight = 150
demo.main()
魔术方法
在python中,__ xx __()的函数叫作魔术方法,指的是具有特殊功能的函数
1,__ init() __ 函数
__ init __()函数,如:每一部手机都有一个出厂时的就已经自定义好的一些数值,如尺寸
因此,此函数的作用就是初始化对象
案例:
class My_body():
def __init__(self, color="red"):
self.height = 30
self.weight = 16
self.color = color
def main(self):
print(self.height)
print(self.weight)
demo = My_body()
print(demo.height)
print(demo.weight)
print(demo.color)
__ init() __ 方法,在创建一个对象时默认被调用,不需要手动调用,而且里面的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
代码结果如下:
注意看,init函数是可以带参数的
2,__ str() __函数
当python输出对象的时候,默认打印对象的内存地址,如果类定义了str方法,那么就会打印从这个方法中return的数据
解释类的属性或作用
案例如下:
class My_body():
def __init__(self, height=185, width=140):
self.height = height
self.width = width
def __str__(self):
return f"你的身高是{self.height},你的体重是{self.width}斤"
demo = My_body()
print(demo)
注意:如果在属性名前加上两个下划线(__),则是声明该属性为私有属性,不能再类的外部被使用或直接访问
下面来看一个综合案列:
综合应用1:烧烤
-
食物的属性
— 被烤的时间
— 被烤的状态
— 被添加的调料
-
烤烧烤的方法
1,根据用户意愿设定每次烤地瓜的时间
2,判断地瓜被烤的总时间是在哪个区间,修改地瓜状态
-
添加调料
需求
1,被烤的时间和对应的食物的状态:
0 - 5分钟 : ⽣的
5 - 10分钟 : 半⽣不熟
10-12分钟 : 烤熟了
超过12分钟: 烤糊了
2,添加调料
案例代码实现功能如下:
class Food_roast():
def __init__(self, ):
self.roast_time = 0
self.roast_state = "生的"
self.roast_seasoning = []
def Food_acquire(self, time):
self.roast_time += time
if 0 < self.roast_time < 5:
self.roast_state = "生的"
if 5 < self.roast_time < 10:
self.roast_state = "半生不熟"
if 10 < self.roast_time < 12:
self.roast_state = "烤熟了"
if self.roast_time > 12:
self.roast_state = "烤糊了"
def add_seasoning(self, *seasoning):
self.roast_seasoning.append(seasoning)
def __str__(self):
return f"当前烤的食物考了{self.roast_time}分钟,食物的状态是{self.roast_state},添加的调料有{self.roast_seasoning}"
if __name__ == '__main__':
demo = Food_roast()
k = int(input("请输入烧烤的时间:"))
demo.Food_acquire(k)
demo.add_seasoning("辣椒", "孜然", "花生酱")
print(demo)
综合应用2:银行自动存取钱
class Auto_bank():
def __init__(self):
self.atm_money = 0
self.my_money = 100
def save_money(self):
num = int(input("请输入存款金额:"))
if num <= self.my_money:
self.atm_money += num
self.my_money -= num
print(f"存钱成功\n当前银行卡的余额为{self.atm_money},我的余额为{self.my_money}")
else:
print(f"您手上并没有这么多玛尼!")
def get_money(self):
num = int(input("请输入您的取出金额:"))
if num > self.atm_money:
print(f"您的银行卡里没有这么多现金")
else:
self.atm_money -= num
self.my_money += num
print(f"取钱成功\n当前您手上余额为:{self.my_money},银行卡里余额为:{self.atm_money}")
if __name__ == '__main__':
while True:
demo = Auto_bank()
k = int(input("请输入您的选择{0:存钱 1:取钱 2:退出系统}"))
if k == 0:
demo.save_money()
elif k == 1:
demo.get_money()
elif k == 2:
print("欢迎下次使用!")
break
else:
print("您的输入有误,请重新输入!")
不足之处,欢迎大家进行指正!!!