Day16 oop基本实现 类——python学习之路

本文介绍了Python中的面向对象编程基础,包括类的定义、成员方法中的self、初始化方法__init__和析构方法__del__。讲解了类的命名规范、属性与方法的概念,以及对象的生命周期和成员访问规则。还讨论了对象的创建、销毁以及self的含义和使用场景。
摘要由CSDN通过智能技术生成

概念

  1. 类名的书写规范, 建议使用驼峰命名法
     大驼峰: MyCar XiaoMi
     小驼峰: myCar xiaoMi

  2. 一个类有特征和功能两个内容组成:
    特征在编程中就是一个变量, 在类中称为 属性
    功能在编程中就是一个函数, 在类中称为 方法

定义

# 定义一个汽车的类
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'>
  1. 在类的外部, 使用对象(例如创建对象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 法拉利被销毁

常见问题

  1. 一个类定义类成员属性和成员方法,那么通过这个类实例化的对象,也具备这些方法和属性吗?
      实际上,创建对象的时候,并不会把类中的属性和方法复制一份给对象,而是在对象中引用父类的方法。因此在访问对象的属性时,会先去找对象自己的属性,如果没有就去找这个类的属性和方法。
  2. 为什么对一个类定义类成员属性和成员方法进行删除时,不能删除自带的属性和方法?
      如果在对象创建后,给对象的属性或方法,进行修改或添加,那么此时等于给这个对象创建了一个自己的属性和方法。所以在删除时,只能删除对象被修改或添加的成员。
  3. self代表什么意思?
      self 单词本身的意思 自己
      self 在类的方法中 代表当前这个对象
      self 代表调用这个方法的对象
      self 就可以在类的内部代替对象进行各种操作
  4. 方法中定义参数时可以不写self吗?
      方法里定义的第一个参数无论取什么名, 都会被当做self使用。
  5. 没有self形参的方法怎么调用?
    如果在类中定义的方法不含self这个形参时,就不能使用 对象.方法()调用,需要使用 类.方法()调用。
    这种不接受对象作为形参的方法,叫做 绑定类方法。
    含有self或者可以接受对象作为参数的方法: 绑定类方法 通过类去访问
    不含self或者不能接受对象作为参数的方法: 非绑定类方法 使用对象去访问
  6. 对象会在哪些情况下被销毁?
    1. 当程序执行完毕, 内存中所有的资料都会被销毁释放
    2. 使用 del 删除对象时
    3. 对象不再被引用时, 会自动销毁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值