老师博客:http://www.cnblogs.com/Eva-J/articles/7351812.html

__new__

__init__是一种初始化的方法

__new__是构建方法,创建一个对象

class A:
def __init__(self):
self.x = 1
print('in init function')
def __new__(cls, *args, **kwargs):
print('in new function')
return object.__new__(cls)
a = A()
print(a.x)
#return object.__new__(cls)中的cls与A等价

先执行了__new__,创建了一个空的的列表给init ,再执行了__init__方法

单例模式
一个类 始终 只有 一个 实例
当你第一次实例化这个类的时候 就创建一个实例化的对象
当你之后再来实例化的时候 就用之前创建的对象

class Singleton:
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):#Meta(元类)为空
print('执行了if')
cls._instance = object.__new__(Singleton, *args, **kw)
#object.__new__(Singleton, *args, **kw)表示返回一个新的空的对象
#cls._instance 可以理解为一个记录创建新对象的一个地址,每创建一个新的
#对象时,_instance便是其地址,并且在创建新的对象前,一直指向上个地址
else:#元类不为空,没有给一个新的地址
print('执行了else')
print(cls._instance)
return cls._instance one = Singleton()
two = Singleton() two.a = 3
print(one.a)
#
# one和two完全相同,可以用id(), ==, is检测
print(id(one))
#
print(id(two))
#
print(one == two)
# True
print(one is two)
#True

__eq__

class A:
def __init__(self,name):
self.name=name
def __eq__(self,other):
print('执行了__eq__')
if self.name == other.name:
return True
else:
return False
a = A('a')
b=A('a')
print(a==b)#True
print(a=='b')
#报错 AttributeError: 'str' object has no attribute 'name'
print('a'== a)
#报错 AttributeError: 'str' object has no attribute 'name'

__eq__是同类的对象比较,一般默认的是比较内存地址,而自己定义这个方法可以比较其他的属性是否一致,例如上面的比较对象的属性

注意,不同的类的对象之间比较会报错,见上面

__hash__

__hash__是表示hash()的方法,一般来说类的哈希见Object.__hash__,但是自己可以定义自己类的哈希的方法,但是注意,list,tuple,set是不可哈希的,除非自己定义,改写hash的方法

class A:
def __init__(self,name,age):
self.name=name
self.age=age
def __hash__(self):
return hash(str(self.name)+str(self.age))
a=A('alex',22)
print(hash(a))
print(hash({1:2}))#报错

面向对象_new,__eq__,__hash__的更多相关文章

  1. Python--day27--几个内置方法:__repr__()/__str__()/__del__()/__call__()/__getitem__/__setitem/delitem/__new__/__eq__/__hash__

    repr方法() 双下方法__str__: 打印对象就相当于打印对象.__str__ __repr__(): __repr__是__str__的备胎,没有__str__的时候,就调用__repr__: ...

  2. 实习小记-python中可哈希对象是个啥?what is hashable object in python?

    废话不多说直接祭上python3.3x的文档:(原文链接) object.__hash__(self) Called by built-in function hash() and for opera ...

  3. python之序列化模块、双下方法(dict call new del len eq hash)和单例模式

    摘要:__new__ __del__ __call__ __len__ __eq__ __hash__ import json 序列化模块 import pickle 序列化模块 补充: 现在我们都应 ...

  4. 【转】实习小记-python中可哈希对象是个啥?what is hashable object in python?

    [转]实习小记-python中可哈希对象是个啥?what is hashable object in python? 废话不多说直接祭上python3.3x的文档:(原文链接) object.__ha ...

  5. 面向对象的进阶(item系列,__new__,__hash__,__eq__)

      面向对象的进阶(item系列,__new__,__hash__,__eq__) 一.item系列 getitem.setitem.delitem(操作过程达到的结果其实就是增删改查) class ...

  6. 面向对象进阶-item系列、__new__、__hash__、__eq__ (四)

    item系列 dic = {'k':'v'}# 对象 : 存储属性 和调用方法dic['k'] = 'v'# class Foo:#     def __init__(self,name,age,se ...

  7. python 重载 __hash__ __eq__

    __author__ = 'root' from urlparse import urlparse class host_news(): def __init__(self, id, url): se ...

  8. day30 小面试题 去重 (考核 __eq__ 以及 __hash__ )

    # 小面试题,要求将一个类的多个对象进行去重 # 使用set方法去重,但是无法实现,因为set 需要依赖eq以及hash, # hash 哈希的是内存地址, 必然不一样 # eq 比较的也是内存地址, ...

  9. python全栈开发day23-面向对象高级:反射(getattr、hasattr、setattr、delattr)、__call__、__len__、__str__、__repr__、__hash__、__eq__、isinstance、issubclass

    一.今日内容总结 1.反射 使用字符串数据类型的变量名来操作一个变量的值. #使用反射获取某个命名空间中的值, #需要 #有一个变量指向这个命名空间 #字符串数据类型的名字 #再使用getattr获取 ...

随机推荐

  1. 【朝花夕拾】Android性能篇之(四)Apk打包

    前言 APK,即Android Package,是将android程序和资源整合在一起,形成的一个.apk文件.相信所有的Android程序员是在IDE的帮助下,完成打包轻而易举,但对打包流程真正清楚 ...

  2. Solr04 - 在Jetty和Tomcat上部署Solr单机服务

    目录 1 准备安装环境 2 通过内部Jetty服务器启动 3 通过配置Tomcat服务器启动 3.1 删除不需要的应用 3.2 修改服务端口 3.3 部署solr.war 3.4 扩展: 虚拟目录发布 ...

  3. webpack无法热加载(__webpack_hmr 502)

    最近本地开发项目代码一直无法热加载,于是就抽空想办法解决 我们线上的地址是:https://aitest.ichuanyi.com/ai-admin/#/  其实ai-admin是线上的一个目录 所以 ...

  4. Linux 中Ctrl + s 的作用

    在Linux下使用vim编辑程序时,常常会习惯性的按下Ctrl + s保存文件内容.殊不知,这一按不紧,整个终端再也不响应了. 事实上Ctrl + s在终端下是有特殊用途的,那就是暂停该终端,这个功能 ...

  5. docker 复制镜像和复制容器

    复制镜像和复制容器都是通过保存为新镜像而进行的. 具体为: 保存镜像 docker save ID > xxx.tar docker load < xxx.tar 保存容器 docker ...

  6. Python UnboundLocalError和NameError错误根源解析

    如果代码风格相对而言不是那么的pythonic,或许很少碰到这类错误.当然并不是不鼓励使用一些python语言的技巧.如果遇到这这种类型的错误,说明我们对python中变量引用相关部分有不当的认识和理 ...

  7. 如何正确使用Java序列化?

    前言 什么是序列化:将对象编码成一个字节流,这样一来就可以在通信中传递对象了.比如在一台虚拟机中被传递到另一台虚拟机中,或者字节流存储到磁盘上. “关于Java的序列化,无非就是简单的实现Serial ...

  8. _C#发送邮箱

    public ActionResult lead() { SendEmail("邮箱号", "吃饭么?", "你要吃什么啊"); retur ...

  9. WPF DesiredSize & RenderSize

    DesiredSize DesiredSize介绍 关于DesiredSize的介绍,可以查看最新微软文档对DesiredSize的介绍 DesiredSize,指的是元素在布局过程中计算所需要的大小 ...

  10. ORM的增删查

    using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; usin ...