概念
-
类名的书写规范, 建议使用驼峰命名法
大驼峰: MyCar XiaoMi
小驼峰: myCar xiaoMi -
一个类有特征和功能两个内容组成:
特征在编程中就是一个变量, 在类中称为 属性
功能在编程中就是一个函数, 在类中称为 方法
定义
# 定义一个汽车的类
class Cart():
# 属性 ==> 特征 ==> 变量
color = '白色'
brand = '奥迪'
pailiang = 2.4
# 方法 ==> 功能 ==> 函数
def laoluo(self):
print('小汽车能拉货')
def doufeng(self):
print('小汽车能兜风')
def bamei(self):
print('带妹子去嗨')
aodiobj = Cart()
print(aodiobj, type(aodiobj))
#(输出) <__main__.Cart object at 0x0000014E08ED6108> <class '__main__.Cart'>
- 在类的外部, 使用对象(例如创建对象a)操作成员属性
-
访问成员属性: 先访问a自己的color属性, 没有, 就去访问这个a的类的属性
-
修改对象的属性值: 实际上等于给这个a创建了一个a对象自己的color属性
-
类中属性一般定义在前面, 方法定义在后面
成员方法中的self
- self在方法中只是一个形参,并不是关键字
- self在方法中代表的是当前这个对象自己
- self在方法中代表对象可以去操作成员,可以使用self在类的内部访问成员
# 定义人类
class Person():
# 成员属性
name = '名字'
age = '年龄'
sex = '性别'
# 成员方法
def sing(self):
print('会唱...')
def dance(self):
print('会跳')
def rap(self):
print(f'我是{self.name}我会rap...')
def func(self):
# 在类的内部可以像类的外部一样, 去访问和操作成员
print(self) # 结果和下面打印zs一样
print(self.name) # 访问对象的属性
self.name = '张三三' # 修改对象的属性
self.sanwei = '40 40 40' # 添加对象的属性
self.rap() # 调用对象的方法
# print(self.name)
# 只要是对象能干的事, self都可以代表对象去完成
# 比如: 成员的所有操作(添加, 删除, 更新, 访问, 调用..)
# 定义一个没有self的方法
def func2():
print('我是一个没有self的方法')
# 实例化对象
zs = Person()
zs.name = '张三'
# 通过类实例化的对象, 可以在类的外部去访问成员属性和成员方法
# 对象.成员
print(zs)
zs.func()
# 如果调用这个没有self的方法zs.func2()
zs.func2()
#(输出) 报错func2() takes 0 positional arguments but 1 was given(没有参数却传了个参数),通过对象调用方法会将对象作为参数传入,而这个方法定义是没有参数的
# 这种方法需要通过类名调用
Person.func2()
oop初始化方法
魔术方法
- 魔术方法也和普通方法一样都是类中定义的成员方法。
- 魔术方法不需要去手动调用的,魔术方法会在某种情况下,自动触发(自动执行)。
- 魔术方法还有一个比较特殊的地方:就是多数的魔术方法的前后都有两个连续的下划线。
- 魔术方法不是我们自己定义的,而是系统定义好的,我们来使用。
初始化方法__init__
- 触发机制:在通过类实例化对象后,自动触发的一个方法
- 作用:可以在对象实例化后,完成对象的初始化()
- 应用场:文件的打开,数据的获取…干活前的一些准备功能…
class Person():
# 成员属性
name = None
age = None
sex = None
# __init__ 初始化方法
def __init__(self, n, a, s):
print('我是一个初始化方法')
# 完成对象属性的初始化
self.name = n
self.age = a
self.sex = s
self.say()
# 成员方法
def say(self):
print(f'大噶好, 唔系{self.name}, 系兄弟就来砍我')
zzh = Person('渣渣辉', 56, '男')
#(输出) 我是一个初始化方法
#(输出) 大噶好, 唔系渣渣辉, 系兄弟就来砍我
析构方法__del__
- 触发机制:当前类实例化的对象被销毁时,自动触发
- 作用:关闭一些打开的资源,即可以在析构方法中完成一些特殊任务,比如在初始化方法中开发的文件,可以在析构方法中关闭
- 注意:是对象被销毁时触发了这个方法,而不是这个方法销毁了对象
'''
定义一个类, 完成一个日志的记录
调用这个对象的时候, 传递一个日志信息
这个对象会创建一个文件, 开始写入, 并在最后关闭这个文件
'''
import time
class writeLog():
# v成员属性v
# 文件的路径
fileurl = './'
# 日志文件的名称
filename = '2019-1-1' # filename = str(time.strftime('%Y-%m-%d'))+'.log'
# v成员方法v
# 初始化 打开文件
def __init__(self):
# 完成文件的打开
print('初始化方法触发了, 完成文件的打开')
self.fileobj = open(self.fileurl+self.filename, 'a+', encoding='utf-8')
# 写日志的方法
def log(self, s):
print(f'把日志: {s} 写入文件中')
# 析构方法
def __del__(self):
print('析构方法触发了, 关闭打开的文件')
# 在对象被销毁时, 关闭在初始化方法中打开的文件对象
self.fileobj.close()
# 实例化对象
l = writeLog()
l.log('今天天气还不错哦..')
# 使用del 手动删除
del l
#(输出)
#初始化方法触发了, 完成文件的打开
#把日志: 今天天气还不错哦.. 写入文件中
#析构方法触发了, 关闭打开的文件
初始析构顺序练习
# 思考一个问题
class Cart():
brand = ''
def __init__(self, b):
self.brand = b
print(f'初始化方法被触发: 创建{self.brand}汽车')
def __del__(self):
print(f'析构方法被触发: {self.brand}汽车已经销毁了')
# 问题. 请写出下面程序的执行顺序
bm = Cart('宝马')
bc = Cart('奔驰')
fll = Cart('法拉利')
#v答案在下面v
1 宝马创建
2 奔驰创建
3 法拉利创建
4 宝马被销毁
5 奔驰被销毁
6 法拉利被销毁
常见问题
- 一个类定义类成员属性和成员方法,那么通过这个类实例化的对象,也具备这些方法和属性吗?
实际上,创建对象的时候,并不会把类中的属性和方法复制一份给对象,而是在对象中引用父类的方法。因此在访问对象的属性时,会先去找对象自己的属性,如果没有就去找这个类的属性和方法。 - 为什么对一个类定义类成员属性和成员方法进行删除时,不能删除自带的属性和方法?
如果在对象创建后,给对象的属性或方法,进行修改或添加,那么此时等于给这个对象创建了一个自己的属性和方法。所以在删除时,只能删除对象被修改或添加的成员。 - self代表什么意思?
self 单词本身的意思 自己
self 在类的方法中 代表当前这个对象
self 代表调用这个方法的对象
self 就可以在类的内部代替对象进行各种操作 - 方法中定义参数时可以不写self吗?
方法里定义的第一个参数无论取什么名, 都会被当做self使用。 - 没有self形参的方法怎么调用?
如果在类中定义的方法不含self这个形参时,就不能使用 对象.方法()调用,需要使用 类.方法()调用。
这种不接受对象作为形参的方法,叫做 绑定类方法。
含有self或者可以接受对象作为参数的方法: 绑定类方法 通过类去访问
不含self或者不能接受对象作为参数的方法: 非绑定类方法 使用对象去访问 - 对象会在哪些情况下被销毁?
- 当程序执行完毕, 内存中所有的资料都会被销毁释放
- 使用 del 删除对象时
- 对象不再被引用时, 会自动销毁