__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. JasperStudio study..

    https://blog.csdn.net/shiyun123zw/article/details/79166448

  2. poj2125 最小点权覆盖集

    题意:有一张图,对于每个点,有出边和入边,现在目的是删除改图的所有边,对于每个点,删除出边的花费Wi-,删除入边的花费Wi+,现在的目的求删去所有边后的花费最小. 建图方法:对于每个点i,拆点为i,i ...

  3. Java程序中如何使用事物

    在java操作数据库是,为了保证数据的一致性,比如转账操作,从一个账户减掉10元,在另一个账户加上10元. 在类中定义的成员属性(变量)不用赋初值,但在函数里头定义的变量就一定要赋初值. packag ...

  4. 邀您共赴数据库学术顶会ICDE 2019——阿里云专场 零距离接触达摩院数据库“最强大脑”

    摘要: 当学术大家遇到技术大拿,会碰撞出怎样的火花?为进一步加深产学研学术交流,阿里云将于ICDE 2019大会期间(4月9日)举办以“云时代的数据库”为主题的技术专场(Workshop) 作为全球数 ...

  5. JavaScript--模拟百度搜索下拉li

    上效果: 主要思路: 函数indexOf() .join().innerHTML的使用,还有 用完的数组要清空 <!DOCTYPE html> <html> <head ...

  6. CVE-2019-0708漏洞利用

    20190514,微软发布补丁,修复了一个严重的RDP远程代码执行漏洞.该漏洞无需身份认证和用户交互,可能形成蠕虫爆发,影响堪比wannycry. 影响范围: Windows 7 Windows Se ...

  7. 【Linux】gnuplot命令大全

    gnuplot命令大全 在linux命令提示符下运行gnuplot命令启动,输入quit或q或exit退出. plot命令 gnuplot> plot sin(x) with line line ...

  8. 2019-1-16-win10-uwp-发布的时候-ILC-编译不通过

    title author date CreateTime categories win10 uwp 发布的时候 ILC 编译不通过 lindexi 2019-1-16 20:37:5 +0800 20 ...

  9. qt 自定义窗口显示鼠标划过的轨迹

    鼠标事件分为四种: 1.按下 2.抬起 3.移动 4.双击 鼠标事件继承与QWidget void mouseDoubleClickEvent(QMouseEvent *event) void mou ...

  10. H5页面IOS中键盘弹出导致点击错位的问题

    IOS在点击输入框弹出键盘  键盘回缩 后 定位没有相应改变  还有  textarea 也会弹出键盘 $("input").blur(function() { console.l ...