Python面向对象-OOP
2021-12-14 15:38 何小六soso 阅读(57) 评论(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('这是一条错误信息,记录在日志中')