主题
面向对象
一、类
类是一个语法,用于创造对象
python
# 定义类的语法:
# python2 class的定义语法
class 类名:
定义类的属性
定义类的对象
# python3 class定义的简化语法
class 类名():
定义类的属性
定义类的对象
# python3 class定义的完整语法
class 类名(object):
定义类的属性
定义类的对象
# 类名规范:大驼峰(每个单词首字母大写)二、对象
对象是类的实体,通过类可以创造出结构相同的对象
python
# 创建对象 对象名 = 类名
# 使用对象(对象.属性,对象.方法)
# self - 谁调用这个方法,self就指向谁
# self是一个内置的函数,系统自动传递,无需关注来源
# id() 获取变量在内存中的地址-10进制
# 通过对象.属性名 = 属性值 给对象添加不同的属性三、魔法方法
魔法方法 - 在某种情况下自动执行的方法
注:+ - * / in 等关键字都是魔法方法的变体
1. __init__
python
# __init__ - 创建对象时自动执行
# 给__init__传递参数是在创造对象时写在类()里面的
# 示例:
# 创造明星类 差异属性:名字,唱的歌
class Star():
def __init__(self, name, song):
self.name = name
self.song = song
def show(self):
print(f'{self.name}正在唱{self.song}')
# 实例化对象
star1 = Star('刘德华', '恭喜发财')
star2 = Star('蔡徐坤', '鸡你太美')
# 调用方法
star1.show()
star2.show()2. __str__
python
# __str__打印对象(手动调用str转换对象的时候...)的时候会自动调用的方法3. __del__
python
# __del__删除对象(清空内存)的时候会自动调用的方法
# 删除类和类的属性时不会触发(类不占用内存)四、面向对象案列(ATM)
python
# 需求:登录,查询,存钱,取钱,退出
# 创建类
class Atm():
# 定义属性
def __init__(self, account, password):
self.account = account
self.password = password
self.money = 0
# 定义方法
# 登录
def login(self):
account = input('请输入用户名:')
password = int(input('请输入密码:'))
if account == self.account and password == self.password:
print('登陆成功')
self.start()
else:
print('账户或密码错误,请重新输入')
# 查询
def search_money(self):
print(f'当前的余额为:{self.money}')
# 存钱
def save_money(self):
save = int(input('请输入存钱金额:'))
self.money += save
print('已存钱')
# 取钱
def get_money(self):
get = int(input('请输入取钱金额:'))
self.money -= get
print('已取钱')
# 开始
def start(self):
while True:
num = input("""
请选择要办理的业务:
1.查询
2.取钱
3.存钱
4.退出
""")
if num == '1':
self.search_money()
elif num == '2':
self.get_money()
elif num == '3':
self.save_money()
elif num == '4':
break
# 对象
bank = Atm('zzbn', 123456)
bank.login()五、面向对象三大特性
1. 封装
python
# 封装
# 规则上的私有:私有属性(方法) __属性名(方法名) - 只能在类的内部访问,不能在类外部访问
# 规范上的私有: _属性名(方法名) - 可以继承,但不推荐使用
# 访问私有属性和方法的语法:对象 ._类名__属性/方法 [不推荐]
# 通过get 和 set 方法访问私有属性2. 继承
python
# 继承
# 直接继承:class 子类名(父类名):
# 多层继承: class 父类名1(父类名2):
# class 子类名(父类名1):
# 多个继承:class 子类名(父类1, 父类2):
# 子类可以同时继承多个父类:先有的先继承,后来的找不同
# 从近到远,逐层继承,没有才继承,有了就跳过,如果有多个,按顺序继承
# 重写:把父类的属性(方法)覆盖掉3. 多态
python
# 多态:python是一个弱类型语言,没有严格意义的多态4. 补充
python
# 菱形继承 - 逐层继承,从近到远,从左到右
# 继承关系的查看 - 类名.mro()
# 私有属性和私有方法无法继承5. super
- 如果子类没有定义自己的
__init__,会自动继承父类的__init__ - 如果子类定义了自己的
__init__,会覆盖父类的__init__,此时需要手动调用父类的__init__
super() 用于调用父类(超类)的方法,最常见的就是在子类的 __init__ 中调用父类的 __init__。
python
class Parent:
def __init__(self, name, age):
self.name = name
self.age = age
class Child(Parent):
def __init__(self, name, age, school):
super().__init__(name, age) # 调用父类的 __init__
self.school = school
c = Child("小明", 12, "第一小学")
print(c.name, c.age, c.school) # 小明 12 第一小学