python类中的双下划线方法
__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类中的双下划线方法的更多相关文章
- python面向对象双下划线方法与元类
目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...
- python中那些双下划线开头得函数和变量--转载
Python中下划线---完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __x ...
- python python中那些双下划线开头的那些函数都是干啥用用的
1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...
- python中那些双下划线开头得函数和变量
Python中下划线---完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __x ...
- Python - 面向对象编程 - 魔术方法(双下划线方法)
什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...
- 测试Python类成员的单下划线,双下划线,两头下划线的区别
首先原谅一个菜鸟叫他“两头下划线”.记得在windows编程中,很多宏定义使用下划线+大写,给人逼格很高的错觉.对于Python下划线的认识,大概是从__dict__这个属性开始的,看__dict__ ...
- Python: 类中为什么要定义__init__()方法
学习并转自:https://blog.csdn.net/geerniya/article/details/77487941 1. 不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. c ...
- python类中的__init__和__new__方法
Python中类: Python中在创建类的过程中最先调用的不是__init__方法而是__new__方法,__new__方法是一个静态方法,在创建一个类对象时其实是通过__new__方法首先创建出一 ...
- Python中被双下划线包围的魔法方法
基本的魔法方法 __new__(cls[, ...]) 用来创建对象 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __i ...
随机推荐
- yii常用操作数据
yii常用操作数据.php <?php defined('YII_DEBUG') or define('YII_DEBUG', true); //当在调试模式下,应用会保留更多日志信息,如果抛出 ...
- spring中 使用说明
在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类 ...
- 建立DbLink 时报ORA-01017/ORA-02063分析及解决
今天在11G的oracle数据库上创建DBlink连接10g的库时, 出现: ORA-01017: invalid username/password; logon denied ORA-02063: ...
- 剑指offer 1-6
1. 二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 分析 ...
- SSM框架用JSON进行前后端数据传输
一个根据用户id查找用户信息的简单功能,使用JSON进行数据的传输 前端代码 这里用bootstrap做简单的样式美化,中间留了个div用来异步的显示查询结果,ajax进行前端的数据传输(class内 ...
- oracle-ORA-01567错误
删除日志4时将在线索1中保留少于两个日志文件
- Java练习 SDUT-2271_Eddy的难题
Eddy的难题 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全 ...
- bzoj2424 订货
Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为 ...
- yum方式安装MySQL【转】
在CentOS7中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 另外至2919年5月4号, 默认安装的my ...
- Spring Boot错误——SpringBoot 2.0 报错: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
背景 使用Spring Cloud搭建微服务,服务的注册与发现(Eureka)项目启动时报错,错误如下 *************************** APPLICATION FAILED T ...