__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. DirectX11笔记(二)--Direct3D初始化1之基本概念

    原文:DirectX11笔记(二)--Direct3D初始化1之基本概念 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/art ...

  2. VisualVM介绍使用

    1    打开VisualVM(这个工具放在JDK安装目录的bin目录下,双击jvisualvm.exe即可打开),如下图所示 以VisualVM自身为例,VisualVM本身也是一个java程序,当 ...

  3. js流星雨效果

    css部分 div { border: 0px solid #fff; border-width: 0px 90px 2px 90px; border-color: transparent trans ...

  4. iOS block 用法

    1.定义Block /* 回传void ,参数也是void 的block*/ void (^blockReturningVoidWithVoidArgument)( void ); /* 回传整数,两 ...

  5. JDBC操作数据库实例

    jdbc操作数据库实例 1.jdbc创建数据库 1.1 前提条件 1.拥有创建和删除表的权限 2.数据库已经启动,且可用 1.2 jdbc创建数据库表的步骤: 导包:导入需要进行数据库编程的 JDBC ...

  6. oracle有哪些审计项

    ACTION NAME 0 UNKNOWN 1 CREATE TABLE 2 INSERT 3 SELECT 4 CREATE CLUSTER 5 ALTER CLUSTER 6 UPDATE 7 D ...

  7. MaxCompute问答整理之6月

    本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文.希望对大家有所帮助,下面咱们正式开始. 1.什么是MaxCompute呢?MaxCompute是由阿里 ...

  8. MUI - myStorage在ios safari无痕浏览模式下的解决方案

    myStorage在ios safari无痕浏览模式下的解决方案 今天看到了这个帖子LocalStorage 在 Private Browsing 下的一个限制, 吓尿了,如果用户开启了无痕浏览,ap ...

  9. 巨蟒python全栈开发-第11阶段 ansible_project2

    一个NB的网站: https://www.toolfk.com/ CDN:将用户的需求送到最近的节点:内容分发网络 有些是专门做CDN的工具 常用的markdown是需要知道的,短信有字数限制. we ...

  10. [软考]之软件过程模型I 标签: 总结软考 2015-10-24 11:58 863人阅读 评论(35) 收藏

    做软考题的时候经常碰到软件工程的题,因为这些题有的很相近,容易混淆,所以在这里总结归纳一下. 软件过程模型: 瀑布模型: 瀑布模型是将软件生存周期中的各个活动规定为依线性顺序连接的若干阶段的模型,包括 ...