双下方法

定义:
双下方法是特殊方法,他是解释器提供的,由双下线加方法名加双下划线 __方法名__具有特殊意义的方法
双下方法主要是Python源码程序员使用的,元编程
我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更有益于我们阅读源码

1.__len__ 计算长度

s = 'nihaoashuaige'
print(len(s))
#len作为内置函数,部分数据类型调用它的时候就会返回其长度,那是什么让这个函数起了这样的作用呢
#看一下字符串的str类的内容里有__len__方法,所以调用len内置函数,其实就是触发了__len__方法
class A:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __len__(self):
        print('调用len方法')
        return len(self.__dict__)
obj = A(')
print(len(obj))
打印结果:
调用len方法
2
触发机制:
调用len,就立即触发了__len__方法,并执行里面的内容

2.__hash__

#我们之前说过,可hash的就是不可变的数据类型,那么这个是如何进行判断的呢
print(hash('nihao')) #返回一串数字
print(hash(123)) #返回一串数字
print(hash([1,2,3])) #报错
打印结果:
-3334696613266170804
123

3.__str__

class A:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self): #打印的时候返回的结果值
        return self.name
obj = A('nihao',18)
print(obj)
打印结果:
nihao

4.__repr__

repr内置函数,原形毕露,调用repr,则触发__repr__方法,返回其原始值

class A:
    def __repr__(self):
        return 'nihao'
obj = A()
print(repr(obj))
打印结果:
nihao

5.__call__ 对象后面加(),触发执行

class A:
    def __init__(self):
        print(111)
    def __call__(self, *args, **kwargs):
        print(666)
obj = A()
obj()  ##对象+()触发__call__方法
打印结果:
111
666

6.__eq__

class A:
    def __init__(self):
        self.a = 1
        self.b = 2
    def __eq__(self, other):
        print(666)
        return '比较'
a = A()
b = A()
print(a == b)
#同一个类的两个实例进行比较,就会触发类中的__eq__方法
打印结果:
666
比较

7.__del__

析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

8.__new__ 类名+()触发__new__方法 构造方法

class A:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __new__(cls, *args, **kwargs):
        print(666)
        return object.__new__(cls)
obj = A(') ##构造一个对象是先触发__new__方法
单例模式(一个类只能实例化一个对象)

class A:
    __instance = None
    def __new__(cls,*args,**kwargs):
        if not cls.__instance:
            obj = object.__new__(cls)
            cls.__instance = obj
        return cls.__instance
ret = A()
print(ret)
ret = A()
print(ret)
ret = A()
print(ret)
打印结果:
<__main__.A object at 0x00000263D5202B00>
<__main__.A object at 0x00000263D5202B00>
<__main__.A object at 0x00000263D5202B00>

9.__item__相关

当你对对象进行类似于字典的操作的时候,就会触发相应的方法

class A:
    def __init__(self,name):
            self.name = name

    def __getitem__(self, item):
        return self.__dict__[item]

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delitem__(self, key):
        print('删除的时候执行我')
ret = A('nihao')
print(ret['name']) #执行getitem
ret['name'] = 'xiaohong' #执行setitem
print(ret.__dict__)
del ret['name'] #执行delitem
打印结果:
nihao
{'name': 'xiaohong'}
删除的时候执行我

10.上下文管理器相关(__enter__ 和 __exit__)

class A:
    def __init__(self,text):
        self.text = text
    def __enter__(self): #开启上下文管理器时执行此方法
        self.text = self.text + '来了'
        return self
    def __exit__(self, exc_type, exc_val, exc_tb): #执行完上下文管理器时执行此方法
        self.text = self.text + '走了'
        return self
obj = A('baobao')
with obj as f:
    print(f.text)
print(f.text)
打印结果:
baobao来了
baobao来了走了

python之路-双下方法的更多相关文章

  1. Python 入门 之 双下方法

    Python 入门 之 双下方法 1.双下方法 ​ 定义:双下方法是特殊方法,它是解释器提供的 由双下划线加方法名加双下划线 方法名的具有特殊意义的方法,双下方法主要是python源码程序员使用的,我 ...

  2. 百万年薪python之路 -- 面向对象之 反射,双下方法

    面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...

  3. Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究

    Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: ​ 反射的概念是由Smith在1982年首次提出的 ...

  4. Python面向对象 | 双下方法

    定义:双下方法是特殊方法,他是解释器提供的.由双下划线+方法名+双下划线 .它具有特殊意义的方法,双下方法主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更 ...

  5. Python反射和内置方法(双下方法)

    Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...

  6. Python面向对象之反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  7. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

  8. python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法

    目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...

  9. python之面向对象函数与方法,反射,双下方法

    一.函数和方法 1.函数和方法的区别 函数: 全都是显性传参,手动传参,与对象无关 方法: 存在隐性传参,与对象有关 1.1通过函数名可以判断 len()就是函数 str.count()就是方法 de ...

随机推荐

  1. Mac OS X

    Mac OS X 除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux(RHEL.Ubuntu.Debian.Fedora.CentOS和SUSE等)都提供了很好的 ...

  2. 四则运算二(java web)

    最近我和我的小伙伴yaoyali结成对子,共同写网页版的四则运算.虽然现在还没弄好,但是比起上次用纯java写的四则运算有了很大改进. 一.存放四则运算题目和答案的类 package com.jaov ...

  3. 转 如何观察 undo Oracle DML语句回滚开销估算

    https://searchdatabase.techtarget.com.cn/7-20392/ --use_urec 详细解读: select USED_UREC from v$transacti ...

  4. 074 Search a 2D Matrix 搜索二维矩阵

    编写一个高效的算法来搜索 m x n 矩阵中的一个目标值.该矩阵具有以下特性:    每行中的整数从左到右排序.    每行的第一个整数大于前一行的最后一个整数.例如,以下矩阵:[  [1,   3, ...

  5. Spring Boot Admin 监控中心

    Spring Boot Admin 监控中心 Spring Boot Admin用来收集微服务系统的健康状态.会话数量.并发数.服务资源.延迟等度量信息 服务端 建立spring-cloud-admi ...

  6. 3D图形引擎决定三维产业差异化

    从2009年中国3D产业初步兴起开始,短短几年间中国的3D技术得到了飞速的发展,3D打印机.3D投影仪.Web3D.虚拟现实.场景漫游等等产业应用应运而生,设备制造商和内容提供商都开始发挥自主创新的优 ...

  7. iOS VIPER架构(二)

    第一篇文章对VIPER进行了简单的介绍,这篇文章将从VIPER的源头开始,比较现有的几种VIPER实现,对VIPER进行进一步的职责剖析,并对各种细节实现问题进行挖掘和探讨.最后给出两个完整的VIPE ...

  8. js构造方法

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Java ...

  9. 【转】 iOS学习之NSBundle介绍和使用

    bundle是一个目录,其中包含了程序会使用到的资源.这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in).对应bundle, cocoa提供了类NSBun ...

  10. 如何使用TensorFlow Hub和代码示例

    任何深度学习框架,为了获得成功,必须提供一系列最先进的模型,以及在流行和广泛接受的数据集上训练的权重,即与训练模型. TensorFlow现在已经提出了一个更好的框架,称为TensorFlow Hub ...