代码改变世界

Python面向对象-OOP

2021-12-14 15:38  何小六soso  阅读(54)  评论(0编辑  收藏  举报

面向对象-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('这是一条错误信息,记录在日志中')