Python基础学习笔记——面向对象(2):魔法方法、魔法属性

Python魔法方法详解
本文深入讲解Python中的魔法方法,包括构造函数__init__、描述信息方法__str__、销毁检测方法__del__以及如何使对象变得可调用的__call__方法等。通过实例演示这些方法的具体应用。

面向对象

魔法方法(内置方法)

  • 在Python类里面,方法名以两个下划线开始和以两个下划线结束,那么这样的方法称为魔法方法,比如:__init____dict____str__等。
  • 魔法方法具有特殊的功能,当需要完成某种操作的时候会自动调用魔法方法。

__init__ – 构造函数

  • 当创建对象的时候会自动调用__init__魔法方法。
  • 作用:给对象添加属性及给属性设置初始值。
class Person(object):
    def __init__(self):
        self.name = "李四"
        self.age = 20
# 创建对象,会自动调用init方法,会给当前对象添加两个属性信息(name, age)
p1 = Person()
print(p1.name, p1.age)
  • 带有参数的init方法,这里要注意self参数不需要程序员手动传参,只需要给第二个参数及后面的参数传参。
class Person(object):
    def __init__(self, new_name, new_age):
        self.name = new_name
        self.age = new_age
    def show(self):
        print("self:", id(self))
        print(self.name, self.age)
p1 = Person("李四", 20)
print("p1:", id(p1))
p1.show()
---------------会发现self的id等于p1的id,说明self就是p1----------------------
p1: 2164594885240
self: 2164594885240
李四 20

__str__

  • 当使用print函数直接打印当前指定对象的时候会自动调用__str__魔法方法。
  • 作用:返回对象的描述信息,描述信息以字符串的形式返回,也就是说str方法返回的是一个字符串。
  • 默认的__str__输出
<__mian__.类名 object at 16进制内存地址>
<__main__.Person object at 0x000001877F653198>
修改默认的str魔方方法
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        # 必须返回字符串类型,提示:对象的描述信息指的就是属性信息
        msg = "姓名: %s  年龄: %d" % (self.name, self.age)
        return msg
        
p1 = Person(name="王五", age=20)
print(p1)
--------------------------------Out---------------------------------
姓名: 王五  年龄: 20

__del__

  • 作用:检测对象是否被销毁,对象销毁内存会被释放。
  • 调用: 当对象销毁的时候会调用__del__魔方方法。
对象销毁的情况
  1. 程序执行结束,程序中所使用的变量都要销毁。
  2. 程序正在执行,当对象的引用计数为0时,对象也会销毁。
  • 引用计数:对象的内存地址被变量使用的次数。
  • 扩展:利用sys模块中的getrefcount函数查看变量被引用的次数。
import sys
class Person(object):
    def __del__(self):
        print("对象销毁了:", id(self))

p1 = Person()
print("p1:", id(p1))
print(p1)

# p2保存的是p1变量保存的内存地址
p2 = p1  # 如果注释掉本句,del p1后内存销毁__del__执行
         # 如果不注释,p2依然指向p1的内存地址,引用为1,程序结束才执行__del__

# 获取引用计数: --扩展
result = sys.getrefcount(p1)
print(result)

# 删除变量: del
# 1. 把变量名删除后续不能再使用该变量名
# 2. 变量保存的对象所对应的引用计数会减1
# 当引用计数为0是,该对象会被释放
del p1
print("看__del__在这句话之前执行还是之后执行。")

__call__

  • 把类的实例变成可调用的对象,就是对象可以直接加括号,一般使用对象都是:obj.name或者obj.getage(),而__call__魔法方法的作用就是:obj(),相当于obj.__call__()
  • 具体可以查看“Python进阶学习笔记”中“装饰器”的“类装饰器”。

__enter__

  • 上下文管理器,即with...as...中必要的魔法方法之一,用于返回一个对象as后的变量,具体查看“Python进阶学习笔记”中的“上下文管理器”。

__exit__

  • 上下文管理器,即with...as...中必要的魔法方法之一,当上下文管理器执行结束时,不论代码正常还是异常,都会先走__exit__方法,具体查看“Python进阶学习笔记”中的“上下文管理器”。

普通内置属性mro()

  • 获取类继承顺序类名.mro(),返回列表,具体用法"Python基础学习笔记"搜索“多继承”。

普通内置属性dir()

  • 查看对象的属性和方法信息dir(对象),返回的是一个列表。具体用法“Python基础学习笔记”搜索“子类不能使用父类的私有属性和私有方法”。

魔法属性(内置属性)

__doc__

  • 输出类"""注释(文档说明)"""里的信息。

__dict__

  • 用于查看对象的属性信息,使用魔法属性“__dict__”对象.__dict__类.__dict__,返回字典形式的属性信息,详细用法Python基础学习笔记搜索“修改私有属性”。

__class__

  • 用于获取对象的类,语法:对象.__class__,返回<class '__main__.类名'>,详细用法可在Python基础学习笔记搜索“类属性和实例属性的操作”。

__all__

  • 当本模块被以“from 模块 import *”的方式导入时,__all__用来指定允许其他模块可以使用的功能代码,详细用法可以在Python基础学习笔记中搜索“导入模块”中的“2、from 模块名字 import 函数/类名”。

__name__

  • 用于判断是否是主模块,如果__name__的值为“__mian__”,那么就说明当前模块是主模块,如果__name__的值为模块的名字,那么说明当前按模块是被其他模块导入调用的。详细用法在Python基础学习笔记中搜索“判断是否是主模块”。

__bases__

  • 用于查看类的父类是谁,(Python2中,不写()表示没有父类),语法:类名.__bases__
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼义虎神

打赏5C币,作者可获得4C币

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值