Python面向对象之魔法方法/双下方法
1.__new__ and __init__
这两个方法都是在实例化的时候执行,__new__ 在 __init__ 之前执行,并且
如果实例化的时候封装属性,__new__也是必须要传的,而且__new__必须有返回
值,而且这个返回值就是对象的内存空间而且会传给__init__的self参数,而且
封装的属性也会传给__init__. class A:
def __new__(cls, *args, **kwargs):
print('我执行了')
return super().__new__(cls) def __init__(self, name):
self.name = name
print('我也执行了') a = A('Tom') 结果:
我执行了
我也执行了 单例模式:
class A:
__INS = None def __new__(cls, *args, **kwargs):
if not cls.__INS:
cls.__INS = super().__new__(cls)
return cls.__INS a0 = A()
a1 = A()
a2 = A()
print(a0)
print(a1)
print(a2) 结果:
<__main__.A object at 0x105e93518>
<__main__.A object at 0x105e93518>
<__main__.A object at 0x105e93518> 2. __hash__ 当调用hash函数,字典的快速查询 创建字典,集合的时候自动调用,为什么字典和集合的创建会调用?
那是因为字典和集合的创建是根据hash函数直接生成哈希值存储的,查询的时候是特别快的。必须有返回值,且为整数。 class A:
def __hash__(self):
print('我执行了')
return 1 a0 = A()
hash(a0)
dic = {a0: ''}
s = {a0} 结果:
我执行了
我执行了
我执行了 3.item系列 和 obj使用[]访问值有关系 __getitem__ obj[key] / obj[start:end] 自动执行
__setitem__ obj[key] = value 赋值的时候自动执行
__delitem__ del obj[key] del 的时候执行 class A:
def __getitem__(self, item):
return getattr(self, item) def __setitem__(self, key, value):
return setattr(self, key, value) def __delitem__(self, key):
return delattr(self, key) a = A() a['k'] = 'v' # __setitem__
print(a['k']) # __getitem__
print(a.__dict__)
del a['k'] # __delitem__
print(a.__dict__) 4.__call__ obj() 和 类()() 自动执行 class A:
def __call__(self, *args, **kwargs):
print('我执行了') a = A() A()()
a() 结果:
我执行了
我执行了 5.__len__ 该方法是对象在调用 len() 这个内置函数的时候自动触发。必须有返回值,且为整数类型 class A:
def __len__(self):
print('我执行了')
return 1 a = A()
len(a) 结果:
我执行了 6. __eq__ 当执行 == 这个魔法糖时自动执行 __eq__ 方法 ,必须有返回值,且为bool class A:
def __init__(self, name, age):
self.name = name
self.age = age def __eq__(self, other):
return True if self.name == other.name and self.age == other.age else False a0 = A('W', 18)
a1 = A('W', 18)
a2 = A('W', 18)
a3 = A('W', 18) a4 = A('W', 18) a5 = A('W', 18)
a6 = A('W', 18)
print(a0, a1)
print(a0 == a1)
print(a3 == a0 == a4) # ==这个语法 是完全和__eq__ 结果:
<__main__.A object at 0x109422438> <__main__.A object at 0x1094224e0>
True
True 7. __str__ and __repr__ # __str__ : str(obj),要求必须实现了__str__,要求这个方法的返回值必须是字符串str类型
# print(obj) '%s'%s(obj) str(obj) 这三种情况会自动触发 # __repr__: 是__str__的备胎.如果有__str__方法,那么
# print %s str都先去执行__str__方法,并且使用__str__的返回值
# 如果没有__str__,那么 print %s str都会执行repr
# repr(obj),%r # 在子类中使用__str__,先找子类的__str__,没有的话要向上找,只要父类不是object,就执行父类的__str__
# 但是如果出了object之外的父类都没有__str__方法,就执行子类的__repr__方法,如果子类也没有,
# 还要向上继续找父类中的__repr__方法.
# 一直找不到 再执行object类中的__str__方法 8. __del__ del obj 和 垃圾回收机制回收这个对象所占内存的时候。
比如就是某对象借用了操作系统的资源,还要通过析构方法归还回去这时会自动调用:文件资源,网络资源
class A:
def __del__(self):
# 析构方法 del A的对象 会自动触发这个方法
print('执行我了') a = A()
del a # 对象的删除 del 结果:
我执行了
如果不用del obj 也会执行,因为程序运行完垃圾回收会回收a这时还会执行__del__方法。
Python面向对象之魔法方法/双下方法的更多相关文章
- python之序列化模块、双下方法(dict call new del len eq hash)和单例模式
摘要:__new__ __del__ __call__ __len__ __eq__ __hash__ import json 序列化模块 import pickle 序列化模块 补充: 现在我们都应 ...
- Python面向对象之反射,双下方法
一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...
- Python面向对象 | 双下方法
定义:双下方法是特殊方法,他是解释器提供的.由双下划线+方法名+双下划线 .它具有特殊意义的方法,双下方法主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更 ...
- Python反射和内置方法(双下方法)
Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...
- python之路-双下方法
双下方法 定义: 双下方法是特殊方法,他是解释器提供的,由双下线加方法名加双下划线 __方法名__具有特殊意义的方法 双下方法主要是Python源码程序员使用的,元编程 我们在开发中尽量不要使用双下方 ...
- Python 入门 之 双下方法
Python 入门 之 双下方法 1.双下方法 定义:双下方法是特殊方法,它是解释器提供的 由双下划线加方法名加双下划线 方法名的具有特殊意义的方法,双下方法主要是python源码程序员使用的,我 ...
- 百万年薪python之路 -- 面向对象之 反射,双下方法
面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...
- Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法
Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...
- python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法
目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...
随机推荐
- 让LoadRunner再次走下神坛
1. LoadRunner 阻碍了性能测试人员对通信过程的理解我希望做性能测试的人能忘掉这个工具.我们都知道VuGen有录制的功能,其实录制这个功能对于测试来说是个非常不好的选择,就是跟 ...
- LNMP搭建随笔
LNMP(即Linux+Nginx+MYSQL+PHP)是目前非常热门的动态网站部署架构,一般是指: Linux:如RHEL.Centos.Debian.Fedora.Ubuntu等系统. Nginx ...
- 系统常用VC++运行时下载地址
Microsoft Visual C++ 2005 Microsoft Visual C++ 2005 Redistributable Package (x86) https://www.micro ...
- 分享知识-快乐自己:Java 中 的String,StringBuilder,StringBuffer三者的区别
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 1):首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer &g ...
- 揭秘FaceBook Puma演变及发展——FaceBook公司的实时数据分析平台是建立在Hadoop 和Hive的基础之上,这个根能立稳吗?hive又是sql的Map reduce任务拆分,底层还是依赖hbase和hdfs存储
在12月2日下午的“大数据技术与应用”分论坛的第一场演讲中,来自全球知名互联网公司——FaceBook公司的软件工程师.研发经理邵铮就带来了一颗重磅炸弹,他将为我们讲解FaceBook公司的实时数据处 ...
- MySQL left join 20161024
公司OA系统上部门上线了一套流程,总部和分公司部门提数据需求都要走线上流程,审批,想想也是不错的,能和绩效更加合理的挂钩,还有打分评价,双向互动. 下午接到一个需求,查看某分公司上周订单使用优惠券情况 ...
- nginx中共享内存的使用
在nginx的进程模型下,类似流量统计.流量控制.数据共享.等需要多个工作进程共同配合完成任务,共享内存是一个重要的进程通讯的方案.本文介绍在nginx的代码中与共享内存相关的功能,包括ngx_shm ...
- 「NOIP2016」「P1850」 换教室(期望dp
题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...
- 高性能的序列化与反序列化:kryo的简单使用
前言:kryo是个高效的java序列化/反序列化库,目前Twitter.yahoo.Apache.strom等等在使用该技术,比如Apache的spark.hive等大数据领域用的较多. 为什么使用k ...
- bzoj 3376 [Usaco2004 Open]Cube Stacking 方块游戏——带偏移量的并查集
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3376 带偏移量的并查集. #include<iostream> #include ...