__getitem__,__setitem__和__delitem__

  实现了对象属性的字典化操作。

class Person:
def __init__(self, name, age, hobby):
self.name = name
self.age = age
self.hobby = hobby def __getitem__(self, item):
if hasattr(self, item):
return self.__dict__[item] def __setitem__(self, key, value):
self.__dict__[key] = value def __delitem__(self, key):
del self.__dict__[key] zxc = Person('zxc', 26, 'read')
print(zxc.name) # zxc 对象原生查看属性的方法
print(zxc['name']) # zxc 通过getitem实现的查看方法
zxc['name'] = 'zzy' # 通过setitem实现修改
zxc['weight'] = 70 # 通过setitem实现增加
print(zxc.__dict__) # {'weight': 70, 'name': 'zzy', 'hobby': 'read', 'age': 26}
del zxc['hobby'] # 通过delitem实现删除
print(zxc.__dict__) # {'name': 'zzy', 'weight': 70, 'age': 26}

  __new__:构造方法:创建一个对象

  实例化要用到__new__方法

class Foo:
def __init__(self, name):
self.name = name def __new__(cls, *args, **kwargs):
return '创建一个对象' obj = Foo('zxc') # 当实例化一个对象的时候,调用的就是__new__方法。
print(obj) # 打印:创建一个对象
class Foo:
def __init__(self, name):
self.name = name def __new__(cls, *args, **kwargs):
return object.__new__(Foo) # object里面的__new__方法用来构造对象 obj = Foo('zxc')
print(obj) # <__main__.Foo object at 0x000002CADD5C0048>

  __new__方法的使用:单例模式

  一种程序设计模式:一个类始终只有一个实例

class Foo:
__instance = False def __init__(self, name, age):
self.name = name
self.age = age def __new__(cls, *args, **kwargs):
if cls.__instance: # 当实例化一个对象之后,后面的实例化就使用之前的对象
return cls.__instance
cls.__instance = object.__new__(cls)
return cls.__instance a = Foo('zxc', 25)
b = Foo('zxf', 22)
print(a.__dict__) # {'name': 'zxf', 'age': 22}
print(b.__dict__) # {'name': 'zxf', 'age': 22}
b.hobby = 'read'
print(a.hobby) # read
# a和b是同一个对象

  __eq__和__hash__

class Foo:
def __init__(self, name):
self.name = name a = Foo('zxc')
b = Foo('zxc')
print(a == b) # False 正常一个类的两个对象即使属性一样他还是不同的 class Foo:
def __init__(self, name):
self.name = name def __eq__(self, other):
if self.name == other.name:
return True
else:
return False a = Foo('zxc')
b = Foo('zxc')
print(a) # <__main__.Foo object at 0x000001543BA60048>
print(b) # <__main__.Foo object at 0x000001543BA604E0>
print(a == b) # True a和b并不相同,但结果却是True,说明==比较时调用的就是__eq__方法,默认使用的都是object的__eq__方法
class Foo:
def __hash__(self):
return 10 a = Foo()
print(hash(a)) # 10 内置函数hash调用的就是对象的__hash__方法

  set会依赖__eq__和__hash__

class Foo:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex def __hash__(self):
return hash(self.name+self.sex) def __eq__(self, other):
if self.name == other.name and self.sex == other.sex:
return True
else:
return False a = Foo('zxc', 25, '男')
b = Foo('zxc', 24, '男')
print(set([a, b])) # {<__main__.Foo object at 0x000002BFB7FC04E0>}
# 当name和sex相同时,a和b被认为是同一个,set后去重 # 注释掉类里的__hash__方法
print(set([a, b])) # 报错 显示类Foo不能哈希 说明set依赖对象的__hash__方法 # 注释掉类里的__eq__方法
print(set([a, b])) # 结果还是两个元素 并没有去重 说明set的去重还依赖对象的__eq__方法返回结果

  __len__

class Foo:
def __len__(self):
return 10 a = Foo()
print(len(a)) # 10 内置函数len调用的就是对象的__len__方法,默认使用的都是object的__len__方法

python类中的双下划线方法的更多相关文章

  1. python面向对象双下划线方法与元类

    目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...

  2. python中那些双下划线开头得函数和变量--转载

    Python中下划线---完全解读     Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __x ...

  3. python python中那些双下划线开头的那些函数都是干啥用用的

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  4. python中那些双下划线开头得函数和变量

    Python中下划线---完全解读     Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __x ...

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

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

  6. 测试Python类成员的单下划线,双下划线,两头下划线的区别

    首先原谅一个菜鸟叫他“两头下划线”.记得在windows编程中,很多宏定义使用下划线+大写,给人逼格很高的错觉.对于Python下划线的认识,大概是从__dict__这个属性开始的,看__dict__ ...

  7. Python: 类中为什么要定义__init__()方法

    学习并转自:https://blog.csdn.net/geerniya/article/details/77487941 1. 不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. c ...

  8. python类中的__init__和__new__方法

    Python中类: Python中在创建类的过程中最先调用的不是__init__方法而是__new__方法,__new__方法是一个静态方法,在创建一个类对象时其实是通过__new__方法首先创建出一 ...

  9. Python中被双下划线包围的魔法方法

    基本的魔法方法 __new__(cls[, ...]) 用来创建对象 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __i ...

随机推荐

  1. word Stock Market Indices

    Stock Market Indices USA Africa Asia and Pacific Canada Europe Middle East South America Internation ...

  2. Mac下搭建python开发环境

    目录 1. 安装brew 2. 安装 mysql 3. 安装 pycharm 4. 安装python3.6 5. 安装virtualenvwrapper 6. 虚拟环境下安装mysqlclient 1 ...

  3. 【风马一族_php】NO2_php基础知识

    原文来自:http://www.cnblogs.com/sows/p/5995763.html (博客园的)风马一族 侵犯版本,后果自负 回顾 什么是php以及php的发展史 搭建web服务器 apa ...

  4. 写一个nginx监控日志

    下面的代码是实现一个nginx监控日志功能,是不是很好玩呢.

  5. map的三种遍历方法!

    map的三种遍历方法!   集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ /* * To change this template, choose Tools | Te ...

  6. Android7.0 添加快速设定Quick Settings Tile

    Android7.0新推出了一个非常实用的功能--添加快速设定(或者翻译成快速设置),但是感觉社区里关注的人比较少,可能目前为止国内还没有Android7.0的手机,但是越早接触越好,甚至可以告诉产品 ...

  7. ios程序员6级考试(答案和解释)

    http://blog.sunnyxx.com/2014/03/06/ios_exam_0_key/ 我是前言 上次发了个ios程序员6级考试题 ,还在不断补充中,开个帖子配套写答案和解释. 1. 下 ...

  8. Java练习 SDUT-1171_保留整数

    C语言实验--保留整数 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入一个字符串str1,把其中的连续非数字的字符 ...

  9. Python基础:13装饰器

    装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的应用有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同 ...

  10. install tushare in python 3.6

    install tushare (D:\Anaconda3) C:\Users\Administrator>pip install tushare Collecting tushare Down ...