【python 10】python 魔术方法

2023-11-03


python 中以 “__” 开头和结尾的成员,都被称为类的特殊成员(特殊属性和方法)。

一、__getitem__ 获取属性

在字典和列表中,我们经常会用到 [] 来获取对应元素,因为字典和列表中都内置了 __getitem__ 方法。

"__getitem__" in (dir(list))
>>>
True
"__getitem__" in (dir(dict))
>>>
True

__getitem__ 的作用:

当定义了一个类的时候,当该类的实例化对象通过 [] 来取值的时候,会调用 __getitem__ 方法,也就是说这个方法能够返回与指定键相关联的值

使用 [] 对对象中的属性进行取值、赋值或删除时,会自动触发对应的 __getitem____setitem____delitem__ 方法

class DataBase:
    def __init__(self,id,address):
        #初始化方法
        self.id=id
        self.address=address
        self.d={self.id:1,self.address:"192.168.1.1"}

    def __getitem__(self,key):
        return self.d.get(key,"default")

data=DataBase(1,"192.168.1.1")
print(data['hi'])         # output default
print(data[data.id])      # output 1
print(data[data.address]) # output 192.168.1.1
print(data[1])            # output 1
class Person(object):
    def __init__(self, info):
        self.info = info
    def __getitem__(self, key):
        print('__getitem__:', key)
        return self.info[key]
person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3}
person = Person(person_info)
print(person['xiaoming'])
>>>
__getitem__: xiaoming
2

如果没有定义 __getitem__ 但使用 [] 来取属性的话,则会报错:

class Person(object):
    def __init__(self, info):
        self.info = info
person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3}
person = Person(person_info)
print(person['xiaoming'])
>>>
TypeError: 'Person' object is not subscriptable

二、__setitem__ 设置属性

__setitem__ 可以设置属性,可以新增,也可以修改现有的

class Person(object):
    def __init__(self, info):
        self.info = info
    def __setitem__(self, key, value):
        print('__setitem__:', key, value)
        self.info[key] = value
person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3}
person = Person(person_info)

###### 2、修改
person['xiaobai'] = 4
print('person_info after change:', person_info)
>>>
__setitem__: xiaobai 4
person_info after change: {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3, 'xiaobai': 4}
class Person(object):
    def __init__(self, info):
        self.info = info
    def __setitem__(self, key, value):
        print('__setitem__:', key, value)
        self.info[key] = value
person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3}
person = Person(person_info)

###### 2、修改
person['xiaowang'] = 5
print('person_info after change:', person_info)
>>>
__setitem__: xiaowang 5
person_info after change: {'xiaowang': 5, 'xiaoming': 2, 'xiaohong': 3}

三、__delitem__ 删除属性

class Person(object):
    def __init__(self, info):
        self.info = info
    def __delitem__(self, key):
        print('__delitem__:', key)
        del self.info[key]
    def __len__(self):
        return len(self.info)
person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3}
person = Person(person_info)
###### 3、删除
del person['xiaoming']
print('person_info after del:', person_info)
>>>
__delitem__: xiaoming
person_info after del: {'xiaowang': 1, 'xiaohong': 3}

四、__len__ 求长度

class Person(object):
    def __init__(self, info):
        self.info = info
    def __len__(self):
        return len(self.info)
person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3}
person = Person(person_info)
###### 4、求长度
print('final len of info:', len(person_info))
>>>
final len of info: 3

总体代码:

class Person(object):
    def __init__(self, info):
        self.info = info
    def __getitem__(self, key):
        print('__getitem__:', key)
        return self.info[key]
    def __setitem__(self, key, value):
        print('__setitem__:', key, value)
        self.info[key] = value
    def __delitem__(self, key):
        print('__delitem__:', key)
        del self.info[key]
    def __len__(self):
        return len(self.info)
person_info = {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3}
person = Person(person_info)
###### 1、获取
print('xiaoming:', person['xiaoming']) 
>>>
__getitem__: xiaoming
xiaoming: 2

###### 2、修改
person['xiaobai'] = 4
print('person_info after change:', person_info)
>>>
__setitem__: xiaobai 4
person_info after change: {'xiaowang': 1, 'xiaoming': 2, 'xiaohong': 3, 'xiaobai': 4}

###### 3、删除
del person['xiaoming']
print('person_info after del:', person_info)
>>>
__delitem__: xiaoming
person_info after del: {'xiaowang': 1, 'xiaohong': 3, 'xiaobai': 4}

###### 4、求长度
print('final len of info:', len(person_info))
>>>
final len of info: 3

五、__call__ 将类变成一个可调用的函数

__call__ 的本质其实是将一个类变成一个函数,使得这个类的实例可以像函数一样调用

python 中,凡是可以将 () 直接应用到自身并执行,都称为“可调用对象”,可调用对象包括自定义函数、python 内置函数、以及类实例对象(即有 call 的类)

对于可调用对象,名称() 可以理解为 名称.__call__() 的简写,

class Test(object):
    def __init__(self, name):
        self.name = name
    def __call__(self):
        print('here is in __call__!')
        print('my name is {}'.format(self.name))
test = Test('xiaowang')
test()
>>>
here is in __call__!
my name is xiaowang

当类中没写 __call__ 的时候:

class Test(object):
    def __init__(self, name):
        self.name = name
test = Test('xiaowang')
test()
>>>
TypeError: 'Test' object is not callable
报错该对象无法调用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【python 10】python 魔术方法 的相关文章

随机推荐

  • e: Incompatible classes were found in dependencies. Remove them from the classpath or use ‘-Xskip-me

    flutter 点击pubspec yaml 里的 Pub get正常 运行项目时报错 e Incompatible classes were found in dependencies Remove them from the class
  • 从gitlab拉代码报错it -c core.quotepath=false -c log.showSignature=false fetch origin --recurse-submodules=

    拉代码报错 it c core quotepath false c log showSignature false fetch origin recurse submodules no progress prune 报错解决方法 切换 因为
  • Pandas知识点-缺失值处理

    Pandas知识点 缺失值处理 数据处理过程中 经常会遇到数据有缺失值的情况 本文介绍如何用Pandas处理数据中的缺失值 一 什么是缺失值 对数据而言 缺失值分为两种 一种是Pandas中的空值 另一种是自定义的缺失值 1 Pandas中
  • strassen矩阵乘法

    Strassen矩阵乘法简要解析 Strassen矩阵乘法具体描述如下 两个n n 阶的矩阵A与B的乘积是另一个n n 阶矩阵C C可表示为假如每一个C i j 都用此公式计算 则计算C所需要的操作次数为n3 m n2 n 1 a 其中m表
  • vue获取input值的方法总结

    1 v model 使用v model创建双向数据绑定 用来监听用户的输入事件以更新数据
  • PL/SQL(显示游标):查询部门为20的(所有员工信息)

    方法一 代码如下 set serveroutput on 1 声明 相关内容 declare 2 程序体 begin for temp in select empno ename job from emp where deptno 20 l
  • 硬件系统工程师宝典(3)-----信号完整性分析是个啥?

    各位同学大家好 欢迎继续做客电子工程学习圈 今天我们继续来讲这本书 硬件系统工程师宝典 上篇我们读到硬件电路的概要设计需要考虑的问题 相关的可行性分析可以使开发工作事半功倍 信号完整性分析概述 今天我们开始学习在高速电路设计中 经常遇到的问
  • v-if与component动态组件与Vue-Router

    v if与component动态组件区别 v if和component动态组件的区别以及优缺点如下 v if是一个指令 它可以根据条件来决定是否渲染一个元素或组件 如果条件为真 那么元素或组件就会被渲染 如果条件为假 那么元素或组件就会被销
  • everything 很多文件搜索不到?

    everything 很多文件搜索不到 知乎链接 https www zhihu com question 42052606 直接解决办法 把 C Users Administrator AppData Local Everything 下
  • TestNG同时使用DataProvider和Parameters

    TestNG Test测试方法中同时使用DataProvider和Parameters 实践中经常会遇到需要在 Test方法中混合使用TestNG的 DataProvider和 Parameters的情形 比如 根据参数的不同使用不同的测试
  • InnoDB存储引擎——表的逻辑存储及实现

    文章目录 表的逻辑存储结构 表分区 表的逻辑存储结构 在InnoDB存储引擎上 表都是根据主键顺序组织存放的 这种存储方式的表称为索引组织表 index organized table 如果一个表没有指定主键 那么会 首先判断是否存在唯一非
  • sql优化(查询大数据量时sql执行时间过长)

    问题 Oracle数据库 sql查询的优化 成交额统计表的sql查询时间过长进行的优化 解决办法 对sql语句中使用视图的部分替换为子查询 对查询表条件字段建立索引 引发的问题 在什么情况下建立索引 及建立索引后引发的开销有哪些 经查询or
  • 分布式应用部署模式下的Quartz配置

    本来计划做一次应用的部署升级 由单机模式 改为集群模式 但是在考虑方案时 除了遇到的SpringBoot优雅退出问题 还有一个需要考虑的问题 就是Quartz定时任务的处理 单机模式下 quartz定时任务很简单 按照文档使用即可 使用RA
  • 为mysql数据库建立索引;mysql索引总结----mysql 索引类型以及创建;mysql_建立索引的优缺点

    因为欣赏所以转载 http www cnblogs com cy163 archive 2008 10 27 1320798 html http www cnblogs com lihuiyong p 5623191 html http w
  • 修改MySQL账号的加密规则plugin和命令查看外键信息

    MySQL8之前的版本中加密规则是mysql native password 而在MySQL8之后 加密规则 是caching sha2 password 现在给大家介绍怎么修改用户的加密规则 修改成旧的加密规则 ALTER USER ro
  • Redis 一些基础知识以及数据类型

    3 启动后杂项基础知识 3 1 redis benchmark Redis 自带一个叫 redis benchmark 的工具来模拟N个客户端同时发出M个请求 启动 redis benchmark 可以通过 redis benchmark
  • CTFshow 文件上传 web156

    目录 思路 总结 思路 这次发现把shell php改成png上传的时候 提示文件类型不合规 可能对文件头进行检测 可以利用图片马来写入shell https github com huntergregal PNG IDAT Payload
  • 【element】el-autocomplete的常见用法

    前言 这段时间突然发现很少写博客了 平时都在平衡工作和休息的时间 周末也没动过笔 而且更重要的是我找不到写的内容了 在经历的初始的新知识的学习阶段后 目前的阶段更加转入对于业务的理解 很多模块在不同项目中都是可以复用的 而且工作中发现开发并
  • JS扁平化(flatten)数组

    JS扁平化分类 1 对象扁平化 深度很深的对象 经过扁平化编程深度为 1 的对象 2 数组扁平化 降维过程 多维数组经过扁平化变成一维数组 首先让我们思考一个这样的题目 假如有一个数组 var arr 1 2 3 4 我们怎么能把arr变成
  • 【python 10】python 魔术方法

    文章目录 一 getitem 获取属性 二 setitem 设置属性 三 delitem 删除属性 四 len 求长度 五 call 将类变成一个可调用的函数 python 中以 开头和结尾的成员 都被称为类的特殊成员 特殊属性和方法 一