Skip to content

面向对象

一、类

类是一个语法,用于创造对象

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

  1. 如果子类没有定义自己的 __init__,会自动继承父类的 __init__
  2. 如果子类定义了自己的 __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 第一小学