1.类的比较
class A(object):
def __init__(self,value):
self.value = value
def __eq__(self,other):
return self.value == other.value
def __ne__(self,other):
return self.value != other.value
def __gt__(self,other):
return self.value > other.value
def __lt__(self,other):
return self.value < other.value
def __ge__(self,other):
return self.value >= other.value
def __le__(self,other):
return self.value <= other.value
 
 
a = A(100)
b = A(200)
 
print ( a == b)
print ( a != b)
print ( a > b)
print ( a < b)
print ( a >= b)
print ( a <= b)
 
备注:__cmp__也是用于比较的,a>b返回1,a<b返回-1,a=b返回0
--------------------------------------------------------
--------------------------------------------------------
--------------------------------------------------------
2.__new__,__init__,__del__
__new__方法,元类里面用到
__init__方法,构造函数,实例化对象的时候用到
__del__方法,简单理解为是一个析构函数,当一个对象被垃圾回收机制回收的时候,其实就是调用了该方法,可以在该方法中定义一些释放资源的操作,如文件的关闭,数据库连接的关闭等(用得不多)
 
3.__str__方法,定义了我们使用str方法直接print一个对象的行为:
class S(object):
def __init__(self,value):
self.a = value
self.b = value
def __str__(self):
return "a=%s b=%s" % (self.a,self.b)
value = S("hello")
print (value)
 
4.__repr__类似于__str__,不过__repr__ 返回的是机器可读的字符串,__str__返回的是人类可读的
 
5.__unicode__返回一个unicode的对象u'hello',类似于__str__方法。
 
6.__hash__,我们定义类的时候是不需要定义__hash__方法的,因为父类object已经定义过了
 
7.__getattr__方法,当一个实例有这个属性的时候直接返回,如果没有会调用该方法
class Test(object):
def __init__(self):
self.a = 1
def __getattr__(self,name):
print ("get attr %s" % name)
 
t = Test()
print t.a
 
t.b
运行返回结果为
1
get attr b
总结:__getattr__的作用就是,当我里面定义了a这个实例变量,我打印它的时候它的值就是a的值1,当我没有定义b这个实例变量的时候,我强行t.b如果没有__getattr__这个方法就会报错,但是如果有这个方法它就会将b赋值给变量name然后打印出来。
 
8.__enter__和__exit__,在IO的部分说过with语法,只要一个类实现了这个两个方法就可以使用with语法:
class W(object):
def __init__(self):
self.f = open('/tmp/text.txt','w')
def __enter__(self):
return self.f
def __exit__(self,*excinfo)
#该方法接受一个可变参数,出现异常的时候将异常传值给该参数,
#在该函数内根据异常可以做相应的处理
self.f.close()
with W() as f:
print (f.closed())#看这个时候text.txt有没有关闭
f.write("hello,world") #向文件中写一行内容
 
print f.closed()#再看这个时候text.txt有没有关闭
 
上例仅仅是个演示,演示了为什么我们可以使用with语法,它会自动关闭文件。
 
class W(object):
def __init__(self):
self.f = open('/tmp/text.txt','r')
def __enter__(self):
return self.f.readlines()
def __exit__(self,*excinfo)
self.f.close()
with W() as f:
for l in f:
print (l)
 
 

十八、Python面向对象之魔术方法的更多相关文章

  1. Python - 面向对象编程 - 魔术方法(双下划线方法)

    什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...

  2. Python 面向对象(三) 魔术方法

    __getitem__ 在对实例或对象使用索引访问时调用,self[key]__dir__ 收集当前模块的信息,包括继承自其它基类(包括object类)的属性和方法 __new 定义如何创建实例__i ...

  3. Python面向对象之魔术方法

    __str__ 改变对象的字符串显示.可以理解为使用print函数打印一个对象时,会自动调用对象的__str__方法 class Student: def __init__(self, name, a ...

  4. 十八. Python基础(18)常用模块

    十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...

  5. Python 类的魔术方法

    Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...

  6. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

  7. Python中的魔术方法详解

    介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...

  8. python所有的魔术方法

    据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...

  9. Python中的魔术方法详解(双下方法)

    介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...

随机推荐

  1. Linux构建DNS主从服务器

    所有服务器:iptables -Fsystemctl stop firewalldsetenforce 0 配置yum 主服务器:[root@localhost ~]# yum -y install ...

  2. Manthan Codefest 19 题解

    这套题还是有点质量的吧 -- 题目链接 A. XORinacci 傻叉签到题,因为异或的性质所以这个序列的循环节长度只有 \(3\) -- 查看代码 B. Uniqueness 因为序列长度乃至数的种 ...

  3. ZROI1153 【线上训练3】数个数

    ZROI1153 [线上训练3]数个数 传送门 一道非常有意思的题,涵盖了各种知识点. 首先,很显然,这是个容斥.容斥可以过掉\(30pts\). 这里我们考虑容斥+DP. 我们令\(dp[i][j] ...

  4. [转载]3.11 UiPath存在文本Text Exists的介绍和使用

    一.Text Exists的介绍 检查是否在给定的UI元素中找到了文本,输出的是一个布尔值 二.Text Exists在UiPath中的使用 1.打开设计器,在设计库中新建一个Sequence,为序列 ...

  5. springboot kafka 消费者

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  6. canal

    https://github.com/alibaba/canal/wiki/QuickStart https://github.com/alibaba/canal/releases/download/ ...

  7. Java连载12-继承开发环境&long类型

    一.集成开发环境(Integrated Develop Environment,简称IDE) 1.什么是集成开发环境 (1)集成开发环境可以使软件开发变得更简单 (2)没有IDE工具: i.需要安装J ...

  8. 33,Leetcode 搜索旋转排序数组-C++ 递归二分法

    题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这 ...

  9. 利用mysql的LOAD DATA INFILE的功能读取客户端文件

    前言:今天在浏览某知论坛时,看到某大佬在渗透过程中使用伪造的MySQL服务端读取客户端文件,此大佬在利用过程中描述得不是很详细,作为小白的我看不懂啊,由此产生了此篇文章. 某大佬文章:https:// ...

  10. Unsafe例子

    Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存.Java中的Unsafe类为我们提供了类似C++手动管理内存的能力,不建议使 ...