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
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__
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__
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之路-双下方法的更多相关文章
- Python 入门 之 双下方法
Python 入门 之 双下方法 1.双下方法 定义:双下方法是特殊方法,它是解释器提供的 由双下划线加方法名加双下划线 方法名的具有特殊意义的方法,双下方法主要是python源码程序员使用的,我 ...
- 百万年薪python之路 -- 面向对象之 反射,双下方法
面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...
- Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究
Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: 反射的概念是由Smith在1982年首次提出的 ...
- Python面向对象 | 双下方法
定义:双下方法是特殊方法,他是解释器提供的.由双下划线+方法名+双下划线 .它具有特殊意义的方法,双下方法主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更 ...
- Python反射和内置方法(双下方法)
Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...
- Python面向对象之反射,双下方法
一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...
- 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:获取对象 ...
- python之面向对象函数与方法,反射,双下方法
一.函数和方法 1.函数和方法的区别 函数: 全都是显性传参,手动传参,与对象无关 方法: 存在隐性传参,与对象有关 1.1通过函数名可以判断 len()就是函数 str.count()就是方法 de ...
随机推荐
- es6新语法系列,查找字符串,模板字符串
一.模板字符串: ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串(template strings).除了使用反撇号字符 ` 代替普通字符串的引号 ' 或 " 外,它们看起来与 ...
- (译)Minimal Shader(最小的着色器)
(原文:https://en.wikibooks.org/wiki/Cg_Programming/Unity/Minimal_Shader) This tutorial covers the basi ...
- QrenCode : linux命令行下生成二维码图片
原文链接:http://wowubuntu.com/qrencode.html # 作者:riku/ / 本文采用CC BY-NC-SA 2.5协议授权,转载请注明本文链接. 对于二维码大家应该并不陌 ...
- js浮点数乘除法
JS在处理浮点数计算时经常会遇到精度的问题,上一篇博客封装了JS浮点数加减法的方法,这一次来封装一下js浮点数乘除法运算. 其实浮点除法的封装跟加减法的封装原理是一样,只是在第一次计算完后会再复位小数 ...
- git从无到有建立一个仓库并上传文件
第一步,创建仓库 登录自己的码云 第二步,本地操作 1.到你所要上传的文件夹中右键 选择git bash here 2.初始化项目 git init 3.连接远程仓库 刚才我们建立的时候的远程地址就 ...
- 关于学习Lisp的一点思考
以前读<黑客与画家>,其中对Lisp语言的赞美和推崇,让我燃起学习Lisp语言的强烈冲动,但很快发现在实际工作中应用的场景很少,出于功利心最终放弃了.直到上周未在家里读完了<大教堂与 ...
- iOS-浅谈runtime运行时机制02-runtime简单使用
http://blog.csdn.net/jiajiayouba/article/details/44201079 由于OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方 ...
- webservice、soap、wsdl
搜集了一些关于webservice.soap.wsdl的基本知识,解决工作中遇到的疑问 一 .什么是webservice(用你的话描述webservice)?在什么时候用webservice(webs ...
- C# 向服务器上传文件(客服端winform、服务端web)
转载 首先写客服端,winform模拟一个post提交: /// <summary> /// 将本地文件上传到指定的服务器(HttpWebRequest方法) /// </summa ...
- Android(java)学习笔记132:eclipse 导入项目是提示:某些项目因位于工作空间目录中而被隐藏。
导致这个错误的原因是工程重名了: 并不是仅仅指文件夹重名,相信很多人也曾经修改过文件夹的名称,可惜没什么用处,关键是修改工程里面的一个文件! 也就是.project这个文件! 用记事本打开,修改一下& ...