2
0
0
01-面向对象编程
面向对象
思维导图

定义类
定义变量
name = 'zs'
age = 18
定义函数
def fn():
# 函数内容
# python2版本的写法
class 类名:
# python3版本的写法
class 类名():
# python3版本完整的写法
class 类名(object):
属性:以前写的变量
方法:以前写的函数
通过类创建对象
对象 = 类名()
模板创造实体
类外部使用:
使用对象的属性 : 对象.属性名
使用对象的方法 : 对象.方法名()
类内部使用:
self.属性名
self.方法名()
self - 谁调用的self就是谁,__init__的self指的是实例对象本身
给对象添加额外的属性:
对象.属性名 = 属性值
访问对象的属性:
对象.属性名
魔法方法
在特定情况下会自动调用的方法
【重点掌握】__ init __ : 创建对象自动调用
__ str __ : 打印对象/str(对象)自动调用
__ del __ : 删除对象的时候(手动删除/代码运行结束的自动删除)
......
通过魔法方法__ init __创建不同的对象
1.手动添加不同的属性
class Car():
#num = 4 #不要写死,要动态设置
def create(self,num):
self.num = num
# 使用动态设置的属性
def look_lunzi(self):
print(f"轮子的数量是{self.num}")
baoma = Car()
# 手动调用-create可以让baoma拥有num属性
baoma.create(4)
# 此时就可以访问baoma的num属性
baoma.look_lunzi()
# 手动添加是可以的,但是会很麻烦,每次都要写相同的代码
dongfeng = Car()
dongfeng.create(8)
qinggui = Car()
qinggui.create(16)
2.通过__ init __自动添加不同的属性
class Car():
#num = 4 #不要写死,要动态设置
def __init__(self,num):
self.num = num
# 使用动态设置的属性
def look_lunzi(self):
print(f"轮子的数量是{self.num}")
# 自动调用-__init__,将__init__参数传递给类即可
baoma = Car(4)
# 此时就可以访问baoma的num属性
baoma.look_lunzi()
dongfeng = Car(8)
qinggui = Car(16)
ATM取款面向对象案例
class ATM():
# 初始化属性
def __init__(self, name, account, password):
# 属性
# 初始金额 - 0
self.money = 0
# 需求:
# 银行的名称
self.name = name
# 银行卡的初始账号密码
self.account = account
self.password = password
# 定义方法:查询余额、存钱、取钱、退出
# 1.查询余额
def search_money(self):
print(f"当前账户金额为:{self.money}")
# 2.存钱
def save_money(self):
save = int(input('请输入要存入的金额'))
self.money += save
# 2.存钱
# 3.取钱
def get_money(self):
get = int(input('请输入要取出的金额'))
self.money -= get
# 4.开始
def start(self):
while True:
choose = input("""
请输入您要办理的业务:
1.查询余额
2.存钱
3.取钱
4.退出
""")
if choose == '1':
self.search_money()
elif choose == '2':
self.save_money()
elif choose == '3':
self.get_money()
elif choose == '4':
# 5.结束
break
# 5.登录
def login(self):
account = input('请输入你的账号')
password = input('请输入你的密码')
if account == self.account and password == self.password:
print(f'登录成功,{self.name}欢迎您~')
self.start()
else:
print('账号或密码错误')
# 创建对象
china_bank = ATM('中国银行', 'laopan1', '123456')
zhaoshang_bank = ATM('招商银行', 'laopan2', '123456')
jianshe_bank = ATM('建设银行', 'laopan3', '123456')
# 使用对象
china_bank.login()
# 练习-ATM:
# 1.能查询余额
# 2.能存钱
# 3.能取钱
# 4.能退出
面向对象的三大特性
- 封装 - 把属性和方法写到类里面,类也支持私有属性和私有方法(类的外部无法访问和使用)
- 继承 - 从近到远,逐层继承,没有才继承,有了就跳过,如果有多个,按顺序继承(类.mro可以查看继承的关系,私有属性和方法不能继承)
- 多态 - python是弱类型语言,没有严格意义上的多态(不同对象调用相同的方法,执行结果不同)
# 封装
class Yeye():
car = '28大杠'
__money = 100000
def damajiang():
print('打麻将咯~')
def __taiji():
print('太极拳')
def work():
print('公务员')
#继承
class Father(Yeye):
#重写父类方法
def work():
print('程序员')
yeye = Yeye()
father = Father()
father.damajiang()
#多态
def work(obj):
obj.work()
work(yeye)
work(father)
细节点补充
- 私有属性和方法不能进行继承
- 继承顺序是逐层继承,由近到远(看mro)
