一、前言

#在python中一切皆对象
'''
创建了一个dict实例-->dic就是dict的实例对象
我们通过dic['k1']可以得到k1所对应的值
那么我们自定义一个类,可不可以使用对象[变量名]的方式得到我们想要得到的值呢?
'''
dic = dict({'k1':'v1','k2':'v2'}) print(dic['k1'])

我们创建一个字典对象并赋初始值,我们可以通过字典对象[key]得到其dic[key]所对应的value。

那么我们自定义一个类,能否通过对象[变量名]得到我们想要的值呢?

class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age zhangsan = Person('zhangsan',30)
print(zhangsan['name']) #TypeError Person object is not subsctiptable

编译器报错了,Python内部提供了支持这种方式访问我们的对象属性的方式,是item系列

二、__getitem__(self,item)

class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age def __getitem__(self, item):
return self.__dict__[item] zhangsan = Person('zhangsan',30)
print(zhangsan['name'])

obj[变量名]  实际上调用了内部的__getitem__(self,item)方法,我们可以通过实现这个方法,来实现想要的效果。

self.__dict__返回的是字典类型的 对象所有的属性

我们通过__getitem__获取到了对象的属性值,响应的也会有对对象的属性进行赋值和修改值得操作:__setitem__()

三、__setitem(self,key,value)

class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age def __getitem__(self, item):
return self.__dict__[item] def __setitem__(self, key, value):
self.__dict__[key] = value def getinfo(self):
print(self.__dict__) #{'name': 'zhangsan', 'age': 30} zhangsan = Person('zhangsan',30)
print(zhangsan['name'])
zhangsan['age'] = 40 #将年龄修改为40
print(zhangsan['age']) #

此时的年龄被修改为40

除了可以修改属性值的作用,__setitem__()还可以添加对象属性

class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age def __getitem__(self, item):
return self.__dict__[item] def __setitem__(self, key, value):
self.__dict__[key] = value def getinfo(self):
print(self.__dict__) #{'name': 'zhangsan', 'age': 30} zhangsan = Person('zhangsan',30)
print(zhangsan['name'])
zhangsan['age'] = 40
print(zhangsan['age'])
zhangsan['school'] = '清华'
print(zhangsan.school) #清华
print(zhangsan['school']) #清华

__setitem__添加对象属性

四、删除对象属性

class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age def __getitem__(self, item):
return self.__dict__[item] def __setitem__(self, key, value):
self.__dict__[key] = value def getinfo(self):
print(self.__dict__) #{'name': 'zhangsan', 'age': 30} def __delitem__(self, key):
del self.__dict__[key] zhangsan = Person('zhangsan',30)
print(zhangsan['name'])
zhangsan['age'] = 40
print(zhangsan['age'])
zhangsan['school'] = '清华'
print(zhangsan.school) #清华
print(zhangsan['school']) #清华 del zhangsan['school']
print(zhangsan['school']) #KeyError : 'school'

__delitem__删除对象属性

Python3 item系列的更多相关文章

  1. [ python ] 反射及item系列

    反射 什么是反射? 通过字符串的形式操作对象相关属性.python中的事物都是对象: 关键方法: (1)getattr:获取属性 (2)setattr:设置属性 (3)hashattr:检测是否含有属 ...

  2. python3爬虫系列19之反爬随机 User-Agent 和 ip代理池的使用

    站长资讯平台:python3爬虫系列19之随机User-Agent 和ip代理池的使用我们前面几篇讲了爬虫增速多进程,进程池的用法之类的,爬虫速度加快呢,也会带来一些坏事. 1. 前言比如随着我们爬虫 ...

  3. Python3爬虫系列:理论+实验+爬取妹子图实战

    Github: https://github.com/wangy8961/python3-concurrency-pics-02 ,欢迎star 爬虫系列: (1) 理论 Python3爬虫系列01 ...

  4. 面向对象 反射 和item系列和内置函数和__getattr__和__setattr__

    反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函 ...

  5. python 全栈开发,Day24(复习,__str__和__repr__,__format__,__call__,__eq__,__del__,__new__,item系列)

    反射: 使用字符串数据类型的变量名来使用变量 wwwh即what,where,why,how  这4点是一种学习方法 反射 :使用字符串数据类型的变量名来使用变量 1.文件中存储的都是字符串 2.网络 ...

  6. Python3练习题系列(09)——物以类聚,人以群分

    目标: 用类管理同类事物 解析: 用到“class”的编程语言被称作“Object Oriented Programming(面向对象编程)”语言.首先你需要做出“东西”来,然后你“告诉”这些东西去完 ...

  7. day7--面向对象进阶(内含反射和item系列)

    一面向对象的结构和成员 1.1面向对象的结构 class A: company_name = '老男孩教育' # 静态变量(静态字段) __iphone = '1353333xxxx' # 私有静态变 ...

  8. 1、__del__ 2、item系列 3、__hash__ 4、__eq__

    1.__del__   析构方法       释放一个空间之前之前 垃圾回收机制   2.item系列   和对象使用[ ]访问值有联系 __getitem__ __setitem__ __delit ...

  9. __del__,item系列 ,hash方法,__eq__,

    # 构造方法 申请一个空间# 析构方法 释放一个空间 # 某个对象借用了操作系统的资源,还要通过析构方法归还回去:文件资源 网络资源 # 垃圾回收机制 class A: def __del__(sel ...

随机推荐

  1. 查看ubuntu版本号

    No.1 cat /etc/issue No.2 cat /proc/version No.3 uname -a No.4 lsb_release -a

  2. Python OS模块操作文件和目录

    #-*-coding:utf-8-*- import os import shutil ###############OS模块############## #获得当前python脚本的工作目录 os. ...

  3. Android学习笔记——关于onConfigurationChanged(转)

    从事Android开发,免不了会在应用里嵌入一些广告SDK,在嵌入了众多SDK后,发现几乎每个要求在AndroidManifest.xml申明Activity的广告SDK都会要求加上注明这么一句属性: ...

  4. Qt error ------ incomplete type 'QApplication' used in nested name specifier

    没有包含 ‘QApplication’ 头文件

  5. Java入门:基础算法之计算园的面积

    本部分内容介绍如何使用Java计算圆的周长和面积.分两种方法来实现: 1)圆的半径由用户输入 2)圆的半径由程序指定 代码1: /** * @作者: 理工云课堂 * @描述: 用户输入圆的半径,程序结 ...

  6. Java入门:MyEclipse安装与破解教程

    MyEclipse Pro 2014 GA的安装过程请参考网页:http://blog.my-eclipse.cn/myeclipse-2014-download-and-install.html 安 ...

  7. Eloquent 条件查询——tucker-eric/eloquentfilter 笔记

    请阅读 https://github.com/Tucker-Eric/EloquentFilter , 里面有很全的文档和注释,以下仅列出关键部分. 1. 安装 composer require tu ...

  8. Linux各种重要配置文件详解

    1:网卡文件/etc/sysconfig/network-scripts/ifcfg-eth0 [root@Gin scripts]# cat /etc/sysconfig/network-scrip ...

  9. [LeetCode] 208. Implement Trie (Prefix Tree) ☆☆☆

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  10. 查看和修改linux系统时间

    一.查看和修改Linux的时区1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区方法 A 命令 : "tzselect" 方法 ...