写给小白的Python之016:面向对象-魔法方法
导读:
1. __init__方法
2. __str__、__repr__方法
3. __del__方法
4. __new__方法
魔法方法:在恰当的时候会自动执行的方法。
- 魔法方法名两边各有2个下划线。
- 方法名称都已经由官方规定好了的。
1. __init__方法
在创建实例时,通常可能都需要有特定的初始状态,所以一个类可以定义一个名为 __init__() 的特殊方法(构造函数):
def __init__(self):
self.data = []
__init__()在创建对象(类的实例化)之后自动执行。用于初始化对象的属性。
过程:定义类->创建对象->执行__init__方法->赋值给对象名。
__init__不能显式地return一个值,因为它默认返回None。
在类的方法里定义属性的固定值,则每个对象实例变量的属性值都是相同的。__init__方法能让实例化的每个对象,都有不同的属性值。
在__init__(self)中定义好形参,实例化对象时,传入实参。
def __init__(self, name, skill):
""" __init__() 方法,用来做变量初始化 或 赋值 操作"""
self.name = name
self.skill = skill
一个类中的多个对象,每个对象的属性是各自保存的,都有各自独立的地址;
但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法。
2. __str__、__repr__方法
__str__方法
__str__()在打印对象时自动执行。用于返回一个字符串,作为对象的描述信息。
该方法只有self一个参数,必须要有返回值,且返回值必须为字符串类型,当在类的外包部print(对象)则打印这个返回值。如果没有__str__(),则默认打印 对象在内存的地址。
class Student(object):def __init__(self, name):self.name = namedef __str__(self):return "%s 是最帅的!" % self.nameprint(Student('salmond')) # 输出__str__方法返回的内容 Student('salmond') # 输出内存地址
__repr__方法
__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说, __repr__()是为调试服务的。
Student('salmond') 输出的是内存地址,如何让它显示内容呢?解决办法是再定义一个__repr__()。但是通常__str__()和__repr__()代码都是一样的,所以,有个偷懒的写法:
class Student(object):def __init__(self, name):self.name = namedef __str__(self):return 'Student object (name=%s)' % self.name__repr__ = __str__s = Student('salmond') print(s)
3. __del__方法
当对象被销毁时,自动调用。用于验证对象是否被销毁、释放资源(关闭文件)等。
class Hero(object):def __init__(self, name):print('__init__方法被调用')self.name = namedef __del__(self):print("__del__方法被调用")print("%s 被 GM 干掉了..." % self.name)taidamier = Hero("泰达米尔") # 创建对象 print("%d 被删除1次" % id(taidamier)) del(taidamier) # 删除对象print("--" * 10)gailun = Hero("盖伦") # 内存地址 gailun1 = gailun # 内存地址同上 gailun2 = gailun # 内存地址同上print("%d 被删除1次" % id(gailun)) del(gailun) print("%d 被删除1次" % id(gailun1)) del(gailun1) print("%d 被删除1次" % id(gailun2)) del(gailun2) # 当引用计数为0时,才会调用__del__方法
总结:
1. 当有变量保存了一个对象的引用时,此对象的引用计数就会加1;
2. 当使用del() 删除变量指向的对象时,则会减少对象的引用计数。如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0的时候,则对象才会被真正删除(内存被回收)。
4.__new__方法
当我们创建一个类的实例时,类会先调用 __new__(cls[, ...]) 来创建实例,然后__init__ 方法再对该实例(self)进行初始化。
一般情况下,我们不需要重载 __new__ 方法。但在某些情况下,我们想控制实例的创建过程,这时可以通过重载 __new_ 方法来实现。
# __new__和__init__的作用,重载 __new__ 方法 class A(object):def __init__(self):print(self) # <__main__.A object at 0x000001DB1C0B7828>print("这是 init 方法") # 这是 init 方法def __new__(cls):print(id(cls)) # 2040549602280print("这是 new 方法") # 这是 new 方法ret = object.__new__(cls)print(ret) # <__main__.A object at 0x000001DB1C0B7828>return retprint(id(A)) # 2040549602280 A()
总结:
- _ 重载 __new__ 方法,需要返回类的实例;因此,__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。
- _ __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例。
- _ __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。
- _ 我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节。
- _ __new__ 是在 __init__ 之前被调用的;
- _ __new__ 是类方法, __init__ 是实例方法;
重载__new__示例:
class A(object):__dict = dict()def __new__(cls):if 'key' in A.__dict:print('EXISTS')return A.__dict['key']else:print('NEW')return object.__new__(cls)def __init__(self):print('INIT')A.__dict['key'] = self>>> a1 = A( ) NEW INIT>>> a2 = A( ) EXISTS INIT>>> a3 = A( ) EXISTS INIT
转载于:https://www.cnblogs.com/salmond/p/9000351.html
写给小白的Python之016:面向对象-魔法方法相关推荐
- Python学习笔记Task11.魔法方法
Python学习笔记Task11.魔法方法 魔法方法格式__init__ 1.基本 init(self[,-]) new(cls[,-]) del(self) str(self) repr(self) ...
- Python的面向对象(二):Python中神奇的魔法方法
魔法方法 Python里面有一种特殊的方法,叫做魔法方法.Python的类里提供的,是由两个下划线开始,再以两个下划线结束的方法. 魔法方法不需要手动调用,会在恰当的时候就会被激活,自动执行. 魔法方 ...
- 小甲鱼Python学习笔记之魔法方法
什么是魔法方法 构造和析构 __init__方法 __new__方法 __del__方法 工厂函数 通过对魔法方法的重写,还可以自定义对象间的算术运算 反运算方法 实现一个计时器的类 time模块的l ...
- Python 特殊成员和魔法方法
Python中有大量类似__doc__这种以双下划线开头和结尾的特殊成员及"魔法方法",它们有着非常重要的地位和作用,也是Python语言独具特色的语法之一! 比如: __init ...
- python私人定制_手把手教你学python第十五讲(魔法方法续私人“定制”)
python无处不对象的深刻理解 前面写了这么多,我觉得有必要从一个大的层面,也就是OO来看问题的本质.只要你调用对象的语法是合乎python的习惯的,那就是可以的,我们以前从来没有像下面这么写过,对 ...
- Python 中常见的魔法方法
什么是Python魔法方法 魔法方法是在Python的类中被双下划线前后包围的方法,如常见的 :init.new.__del__等.这些方法在类或对象进行特定的操作时会自动被调用,我们可以使用 ...
- Python 关键词触发的魔法方法
with:__enter____exit__ dic={} 获取容器中指定元素的行为 dic["name"] = "egon" #设置值 __setitem__ ...
- python中常见的魔法方法 magic method
魔法方法 magic method(类中定义的双下方法) 魔法方法都是父类object有的,在python3中所有的类默认都会继承object.当我们对这个对象使用这些函数或者运算符时就会调用类中的对 ...
- Python面向对象魔法、元类简介及使用
文章目录 一.反射实战案例 二.面向对象魔法方法 三.魔法方法笔试题 四.元类简介 五.产生类的两种方式 六.元类基本使用 七.元类进阶 一.反射实战案例 1.获取配置文件中所有大写的配置 小写的直接 ...
最新文章
- 直接拿来用!CTO 创业技术栈指南
- conda 基本操作
- ascii码01100001_ASCII编码和Unicode编码
- java判断字符串是什么编码_java可供判断某字符串是什么编码的一行代码
- Log4Net的WebApplication使用
- centos使用git安装nvm
- 幻世机器人_2014年科幻动作《幻世追踪/启动机械码》BD中英双字幕
- MySQL 报错 1093
- 快速傅立叶变换(FFT)算法(原来这就是蝶形变换)
- MySQL表/视图/存储过程and函数/触发器/事件与数据库之间的关系
- AJPFX分析int 和integer的区别
- (41)Xilinx MMCM IP核配置(二)(第9天)
- 自制XML解析器源码分析
- HW RIPv2认证
- 对计算机科学与技术专业课程的认识,计算机科学与技术专业课程
- 鬼谷八荒先天气运修改器
- Oracle数据库上机练习6
- 一文解读广告投放落地页
- 【解决】grafana密码出现错误无法登录,强制进行密码修改
- execute、executeQuery、executeUpdate的用途及返回值
热门文章
- 鱼c笔记——Python文件
- 做代理记账公司销售怎么样找客户
- 每日机话:苹果iPhone4S亚马逊合约促销
- 技术解析 | 横纵一体的无人车控制方案
- 路由器的信号无法连接到服务器,360安全路由P1无线终端能搜索到无线信号但连接不上...
- AIGC周报|30秒定制一个文生图模型;60美元让AI玩转《我的世界》;手机版“文生图”模型:2秒不到出一张图
- 计算机画大熊猫教案,幼儿园大班美术画大熊猫教案
- 【小技巧】使用MATLAB读取quartusii中signaltapII保存的tbl格式数据文件
- 2022-2028全球及中国用户威胁防护软件行业研究及十四五规划分析报告
- Win10睡眠唤醒后,有线网络已连接未识别,必须要禁用再启用解决办法