• Python面向对象OOP


    面向对象-OOP

    面向对象编程 Object Oriented Programming 简称OOP

    面向过程编程 Procedure Oriented Programming 简称POP

    POP思想

    把大象装进冰箱需要几步?

    • 打开冰箱门
    • 把大象装进去
    • 关上冰箱门

    OOP思想

    把大象装进冰箱需要几步?首先建立抽象模型--

    • 大象

      大象属性:四条腿,一条尾巴,一个头

      大象功能:走进冰箱

    • 冰箱

      冰箱属性:有两个门

      冰箱功能:门可以打开和关闭

    创建类进行实例化对象并使用

    # 面向对象基本实现
    """
    类有特征和功能两个内容组成:
        属性:颜色、品牌、排量
        方法:驾驶、运货
    """
    
    
    # 定义汽车类,类名使用驼峰命名法
    class Car():
        # 属性
        color = '蓝色'
        brand = 'volvo'
        pailiang = '2.0T'
    
        # 方法
        def yunhuo(self):
            print('运了一箱纸')
    
        def jiashi(self):
            print('开车去上班')
    
    # 使用Car类实例化对象
    car = Car()
    # 通过对象调用方法
    car.yunhuo()
    car.jiashi()
    # 通过对象获取属性
    print(car.brand)
    print(car.color)
    print(car.pailiang)
    

    对象成员的操作

    什么是对象成员?

    • 实例化对象之后,类种定义的属性和方法,可以使用对象进行操作
    • 类中的属性称为成员属性,类中的方法称为成员方法
    class Car():
        # 属性
        color = '蓝色'
        brand = 'volvo'
        pailiang = '2.0T'
    
        # 方法
        def yunhuo(self):
            print('运了一箱纸')
    
        def jiashi(self):
            print('开车去上班')
    
    
    # 实例化对象,一个类可以实例化多个对象
    c = Car()
    print(c)
    b = Car()  # <__main__.Car object at 0x000002001E5C2FA0>
    print(b)  # <__main__.Car object at 0x000002001E5C2FA0>
    """
    上面两个对象,通过car类实例化生成
    但c和cc是两个不同的对象
    """
    # 通过对象获取类中属性,对象先访问对象自己的属性,如果没有就访问类的属性
    print(c.color)  # 蓝色
    # 修改类中属性值
    c.color = '黑色'  # 黑色
    print(c.color)
    print(b.color)  # 蓝色   只修改了c对象的属性
    
    # 删除对象属性,针对对象c修改的属性可以进行删除操作
    del c.color
    print(c.color)  # 蓝色
    
    # 添加类中属性
    c.name = 's60L'
    print(c.name)  # s60L
    # print(b.name)  # AttributeError: 'Car' object has no attribute 'name',在类的外部添加属性只添加了对象c的属性
    
    # 删除属性
    del c.name  # 删除成功,在类外添加的属性可以删除
    
    # 通过对象获取类中方法,如果对象c没有自己的方法,那么就会访问对象c这个类的方法
    c.yunhuo()  # 运了一箱纸
    
    
    # 修改对象方法
    def func():
        print('修改了对象的方法')
    
    
    c.yunhuo = func
    c.yunhuo()  # 修改了对象的方法
    
    # 给对象添加方法
    c.addfunc = func
    c.addfunc()  # 修改了对象的方法
    
    # 删除对象方法,新增加和修改的成员方法可以删除
    del c.addfunc  # 删除成功
    del c.yunhuo  # 删除成功
    

    self

    """
    self中文翻译:自己、本身
    self在类的方法中代表当前这个对象
    self代表调用这个方法的对象
    self可以在类的内部代替对象进行各种操作
    """
    
    
    class Person():
        # 成员属性
        name = 'python'
        age = '11'
        sex = '男'
    
        # 成员方法
        def sing(self):
            print('唱歌')
    
        def dance(self):
            print('跳舞')
    
        def eat(self):
            print('吃饭')
            # 修改对象属性
            self.name = 'java'
            print(self.name)  # java
            # 添加对象属性
            self.email = '123@126.com'
            print(self.email)  # 123@126.com
            # 调用对象方法
            self.dance()  # 跳舞
    
        # 添加成员方法时使用self调用成员属性
        def play(self):
            print(f'我是{self.name},我再玩游戏')  # 我是java,我再玩游戏
    
        def func():
            print('这是一个绑定类方法')  # 这是一个绑定类方法
    
    
    # 测试在类的内部是否可以访问成员
    
    # 实例化对象
    p = Person()
    # 类的外包调用成员属性
    print(p.name)
    p.eat()
    p.play()
    Person.func()
    

    析构方法__del__

    析构方法,在对象被销毁时触发

    • 作用:关闭打开的资源
    • 注意:是对象销毁时触发了析构方法,而不是析构方法销毁了对象

    对象在哪些情况下会被销毁:

    • 程序执行完毕,内存中所有资源都会被销毁
    • 使用del删除对象 (del 对象)
    • 当对象没有被引用时
    # 析构方法__del__
    # 析构方法,在对象被销毁时关闭初始化方法中打开的文件
    """
    定义一个类,完成信息的记录
        调用对象的时候传递一个信息
        对象创建一个文件,开始写入,写入完成后关闭这个文件
    """
    import time
    
    fp = open('./txt/7.txt', 'a+', encoding='utf-8')
    fp.write('sss')
    fp.close()
    
    
    class writeLog():
        fileurl = './'
        filename = '000.log'
    
        def __init__(self):
            # print('打开文件')
            self.fp = open(self.fileurl + self.filename, 'a+', encoding='utf-8')
    
        def wLog(self, s):
            # self.fileobj.write(s)
            print(f'文件{s}写入成功')
    
        # 析构方法,在对象被销毁时关闭初始化方法中打开的文件
        def __del__(self):
    
            print('关闭文件')
            # self.fileobj.write(s)
            self.fp.close()
    a = writeLog()
    a.wLog('a')
    

    封装日志类

    """
    分析:
    日志文件默认存在当前目录
    日志文件命名格式:2021-12-10.log
    日志内容格式:2021-12-10 10:10:10 错误信息:。。。。
    
    属性:成员属性作用存储信息,供成员方法使用
    fileurl日志文件地址
    filename 日志文件名称
    fileobj 打开的文件对象
    
    方法:具体完成的一个功能的过程
    __init__()  初始化方法:完成对象的初始化,并打开文件
    wlog()  负责接收用户的日志信息,并写入到日志文件中
    __del__ 析构方法:在对象销毁时关闭打开的文件
    """
    import time
    
    
    class mylog():
        # 文件存储位置
        fileurl = './'
        # 文件命名
        filename = str(time.strftime('%Y-%m-%d')) + '.log'
        # 打开的文件对象
        fileobj = None
    
        # 初始化对象
        def __init__(self):
            self.fileobj = open(self.fileurl + self.filename, 'a+', encoding='utf-8')
            print(self.fileurl + self.filename)
    
        # 写入方法
        def wlog(self, s):
            date = time.strftime('%Y-%m-%d %H:%M:%S')
            msg = date + ' ' + ':' +'  '+ s + '\n'
            print(msg)
            # print(type(self.fileobj))
            self.fileobj.write(msg)
    
        # 析构方法
        def __del__(self):
            # 关闭打开的文件
            self.fileobj.close()
    
    
    # 调用方法
    c = mylog()
    c.wlog('这是一条错误信息,记录在日志中')
    
  • 相关阅读:
    javaweb消息中间件——rabbitmq入门
    virtual box 桥接模式(bridge adapter)下无法获取ip(determine ip failed)的解决方法
    Apache Kylin本地启动
    git操作
    Java学习总结
    Java中同步的几种实现方式
    hibernate exception nested transactions not supported 解决方法
    vue 中解决移动端使用 js sdk 在ios 上一直报invalid signature 的问题解决
    cookie 的使用
    vue 专门为了解决修改微信标题而生的项目
  • 原文地址:https://www.cnblogs.com/hekaiqiao/p/15688230.html
Copyright © 2020-2023  润新知