面向对象进阶

面向对象进阶

1、类属性

  • 定义

    class Demo(object):
        '''定义类属性'''
        name = 'lucky'
        age = 18
    d1 = Demo()
    
  • 调用

    可以通过类调用

    可以通过对象调用

    d1 = Demo()
    # 通过对象调用
    # 类中定义的属性  所有实例化的对象 都拥有
    print(d1.name)
    d2 = Demo()
    print(d2.name)
    # 通过类调用
    print(Demo.name)
    
  • 给类绑定属性(增加类属性)

    类名.属性名 = 属性值

    # 绑定类属性
    Demo.sex = 'man'
    print(d1.sex)
    print(d2.sex)
    
  • 类/对象对属性的操作

    • hasattr() 判断是否有该属性
    • setattr() 设置属性
    • getattr() 获取属性值
    print(getattr(Demo, 'name'))
    setattr(Demo, 'sex', 'man')
    print(hasattr(Demo, 'name'))
    print(hasattr(Demo, 'namee'))
    

2、对象属性

  • 概述

    • 通过实例化对象或self对象创建的属性 称为对象属性
    • 对象属性只能存在于当前对象中
    • 对象属性只能由对象调用
  • 创建对象属性

    • 类实例化的对象创建
    • 通过类的内部的self进行创建
    class Demo:
        name = 'lucky'
    
        # 类中创建对象属性的方法
        def create_attr(self, attr, value):
            # 属性不能传递变量 否则属性名为 当前的变量名
            print(attr, value)
            self.attr = value
            print(self.__dict__)
    
    d1 = Demo()
    # 创建对象属性sex
    d1.sex = 'man'
    # 通过对象属性调用的
    print(d1.sex)
    # 报错  类不能调用对象属性
    print(Demo.sex)
    d1.create_attr('age', 18)
    print(d1.attr)
    
  • 类/对象操作属性或方法

    • hasattr() 判断是否有该属性
    • getattr() 获取该属性值
    • setattr() 设置属性值
    print(getattr(d1, 'name'))
    print(setattr(d1, 'name', 'zhangsan'))
    print(d1.name)
    print(hasattr(d1, 'name'))
    print(hasattr(d1, 'namee'))
    
  • 注意

    • 使用对象创建的属性 只有当前对象拥有 和 别的对象没有关系
    • 使用类创建的属性 所有对象都拥有
    • 在对象中修改类中的属性 实则为创建了新的和类中同名的对象属性 当调用的时候 优先调用对象属性 如果对象中不存在 则去类中查找该属性 如果类中不存在 则抛出属性错误的异常
    • 类中self所创建的属性也为对象属性 哪个对象调用的 则该属性属于哪个对象的
    • 对象对类中的所有属性和方法只有使用权 没有操作权
    • 类可以修改删除自己类中的属性和方法

3、案例

import time
class ATM:
    # 默认ATM中金额为0元
    money = 0
    # 操作的用户
    user = ''

    # 存款
    def set_money(self):
        # 获取用户输入的金额
        # 金额的异常处理   判断存款金额
        money = eval(input('请输入存款金额:'))
        # 更改money金额
        self.money += money
        print('恭喜:{} 存款成功 存款金额为:{} 卡内余额为:{}'.format(self.user, money, self.money))
    # 取款
    def get_money(self):
        # 取款金额和卡内余额的关系
        # 判断当前用户取款金额 是否为 整数的金额 100、200、300
        money = eval(input('请输入要取款的金额'))
        if self.money < money:
            print('抱歉 您卡内余额不足~')
            return
        # 余额的处理
        self.money -= money
        print('恭喜:{} 取款成功!取款金额为:{} 卡内可用余额为:{}'.format(self.user, money, self.money))


    # 查看金额
    def look_money(self):
        print('欢迎:{} 您卡内余额为:{}'.format(self.user, self.money))


user = ATM()

# 欢迎...来办理业务
if __name__ == '__main__':
    print('******************************')
    print('******************************')
    print('*****欢迎来到ATM自助取款机*****')
    print('******************************')
    print('******************************')
    # 输入用户姓名
    user.user = input('请输入当前客户姓名:')
    while True:
        print('**********1    存款********************')
        print('**********2    取款********************')
        print('**********3    查看余额****************')
        choose = eval(input('请输入你要办理的业务'))
        if choose == 1:
            user.set_money()
        elif choose == 2:
            user.get_money()
        elif choose == 3:
            user.look_money()
        else:
            print('抱歉、请重新输入')
        time.sleep(2)

4、对象与类绑定方法

  • 对象绑定方法

    • 直接给对象赋值函数

      class Test:
          name = 'lucky'
      
      t1 = Test()
      
      def run(self):
          print(self.name)
          print('大伟 is running')
      
      # run属性存储为 run函数体
      t1.run = run
      t1.run(t1)
      
    • 使用MethodType进行绑定

      from types import MethodType

      from types import MethodType
      
      # 使用MethodType去绑定对象方法
      t1.run = MethodType(run, t1)
      t1.run()
      

      注意:对象绑定属性或方法、都只存在于当前的对象中 和其它对象无关

  • 类绑定方法

    • 直接赋值

      class Test:
          pass
      t1 = Test()
      def run(self):
          print(self)
          print('大伟 is running...')
      # 直接赋值法
      Test.run = run
      t1.run()
      
  • 使用MethodType进行绑定

    from types import MethodType

    # 使用MethodType进行绑定
    Test.run = MethodType(run, Test)
    
    print(t1.run())
    

    给类绑定属性和方法 所有对象都存在该属性和方法

5、限制绑定属性

  • 概述

    __slots__ 限制绑定的属性

  • 使用

    如果绑定了不允许绑定的属性 则抛出异常

  • 实例

    class Test:
        # 限定可以绑定age, abc属性
        __slots__ = ['age', 'abc']
        name = 'lucky'
    t1 = Test()
    t1.age = 18
    t1.abc = 'abc'
    
  • 注意

    使用__slots__ 属性限制 只针对当前对象起作用 对继承的子类不起作用

    多个属性用列表、元组都可以

6、对象初始化状态

  • 需求

    类创建的多个对象 属性的初始值是不同的

  • 格式

    __init__ 方法

  • 使用

    class Person(object):
        # 当实例化的时候 动态绑定对象属性
        # def __init__(self, name, age, sex):
        def __init__(self, name='lucky', age=18, sex='man'):
            self.name = name
            self.age = age
            self.sex = sex
            print('你看我是不是执行了小老弟')
    

    调用

    zhangsan = Person('张三')
    print(zhangsan.__dict__)
    

7、析构方法

  • 作用

    释放一些不必要的内存

  • 格式

    __del__ 在代码执行完自动调用

  • 使用

    class Test:
        def __init__(self, name):
            self.name = name
    
        def say(self):
            print('我是一个say方法')
    
        def __del__(self):
            print('代码执行完会自动调用')
    
    t = Test('lucky')
    print(t.name)
    t.say()
    

    使用场景

    • 释放内存
    • 关闭文件句柄
    • 关闭数据库的链接

    8、案例

  • bulletBox.py

    # 子弹
    class BulletBox(object):
        def __init__(self, count):
            self.bulletCount = count
    
  • gun.py

    # 枪
    class Gun(object):
        # 枪的初始化 有了弹夹
        def __init__(self, bulletBox):
            self.bulletBox = bulletBox
        # 射击
        def shoot(self):
            if self.bulletBox.bulletCount == 0:
                print('没有子弹了~')
            else:
                self.bulletBox.bulletCount -= 1
                print('剩余子弹:{}发'.format(self.bulletBox.bulletCount))
    
  • person.py

    # 人
    class Person(object):
        # 构造方法 实例化的时候 创建对象属性gun
        def __init__(self, gun):
            self.gun = gun
    
        # 射击
        def fire(self):
            self.gun.shoot()
    
        # 填充子弹
        def fillBullet(self, count):
            self.gun.bulletBox.bulletCount = count
    
  • main.py

    from bulletBox import BulletBox  # 导入弹夹
    from gun import Gun  # 导入枪
    from person import Person  # 导入人
    # 实例化弹夹
    bulletBox = BulletBox(5)
    # 枪
    gun = Gun(bulletBox)
    # 实例化人
    zhangsan = Person(gun)
    # 开枪
    zhangsan.fire()
    zhangsan.fillBullet(5)
    zhangsan.fire()
    
posted @ 2022-03-18 14:11  寻月隐君  阅读(30)  评论(0编辑  收藏  举报