python类内部方法__setattr__ __getattr_ __delattr__ hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()
主要讲类的内部方法 __setattr__ __getattr_ __delattr__ hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()
主程序如下:
class Foo:
def _inif(self,pname):
self.pname = pname
def func():
print('i'm func')
def __getattr__(self, item):
print('提示:属性[%s]不存在。'%item)
def __setattr__(selft, key, value):
print('提示:属性赋值操作:[%s=%s]'%(key,value))
self.__dict__[key]=value
#self.key=value
#无法使用,会无限递归,这就是调用本身__setattr__
def __delattr__(self, item):
print('提示:删除属性操作:删除[%s]'%item)
if item in self.__dict__:
self.__dict__.pop(item)
#del self.item #无限递归了
#无法使用,会无限递归,这就是调用本身__delattr__
程序分块讲解
1、得到属性值。__getattr__方法的运行流程,以及getattr的运行流程。当不存在属性名/方法名时,查找__getattr__()方法是否存在,存在即执行它。不存在再查看有没有默认参数,有则返回,没有则报错。
def __getattr__(self, item):
print('提示:属性[%s]不存在。'%item)

2、判断属性/方法名是否存在。__getattr__方法的运行流程,以及hasattr的运行流程

3、给属性赋值。setattr(对象名, 属性名字符串,属性值),例如:setattr(f1,'y','ccc')。
当__setattr__方法存在时,执行它内部的程序,必须执行:self.__dict__[key]=value,要不然不会进行赋值。(该方法默认返回值是None,一般不会使用)
4、删除属性。delattr(对象名, 属性名字符串),例如:delattr(f1,'y')。
当__delattr__方法存在时,执行它内部的程序,必须执行:
if item in self.__dict__:#要进行判断,如果键不存在,pop会出错。
self.__dict__.pop(item)
要不然不会进行删除。(该方法默认返回值是None,一般不会使用)
5.__getattribute__方法,只要调用属性就会进行__getattribute__方法,只有遇到raise AttributeError()(必须是AttributeError异常)才会执行__getattr__
代码如下:
class Foo:
def __init__(self, guestname, guestmobile):
self.guestname = guestname
self.guestmobile= guestmobile
def __getattribute__(self, item):
print('获取属性值操作 %s'%item)
if item != 'guestname':
raise AttributeError()
def __getattr__(self, item):
print('找不到属性 %s'%item) f = Foo('小王','13945784807')
f.guestname
f.guestage
执行结果:
获取属性值操作 guestname
获取属性值操作 guestage
找不到属性 guestage

6.操作对象的属性/方法名时,像字典一样操作__getitem__(),__setitem__(), __delitem__(),具体操作字典方法要在其中自己写。以下代码只列了setitem,其余的都操作self.__dict[xx]=xx就可以。
class Foo:
pass
f =Foo()
f['a']=12
执行结果:
TypeError: 'Foo' object does not support item assignment
class Foo:
def __setitem__(self, key, value):
print('run setitem')
self.__dict__[key]=value f =Foo()
f['a']=12
print(f.a) 执行结果:
run setitem
12
口诀:
对象/类的 点的操作,都和attr相关
对象/类的 中括号的操作,都和item相关
7.__str__和 __repr__,对象返回值的方法,他们内部必须以return返回,必须返回str类型的值。
a.当编译器提示性返回时,就调用__repr__()
b.当print或者str(对象实例名),就调用__str__()
>>> class Foo:
... def __str__(self):
... return 'ggg'
... def __repr__(self):
... return 'xxx'
...
>>> f = Foo()
>>> f
xxx
>>> class Foo:
... def __str__(self):
... return 'ooo'
...
>>> f=Foo()
>>> f
<__main__.Foo object at 0x000001AB94DC9C18>
>>> print(f)
ooo
>>>

口诀:print()方法变量方法顺序,找str,再找repr
'''
str函数或者print函数--->obj.__str__()
repr或者交互式解释器--->obj.__repr__()
如果__str__没有被定义,那么就会使用__repr__来代替输出
注意:这俩方法的返回值必须是字符串,否则抛出异常
'''
python类内部方法__setattr__ __getattr_ __delattr__ hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()的更多相关文章
- python类及其方法
python类及其方法 一.介绍 在 Python 中,面向对象编程主要有两个主题,就是类和类实例类与实例:类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中 ...
- python 魔法方法之:__getitem__ __setitem__ __delitem__
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- python中的__len__,__getitem__ __setitem__ __delitem__ __contains__
可变集合需要实现: __len__ __getitem__ __setitem__ __delitem__不可变集合需要实现: __len__ __getitem__ __len__:返回 ...
- Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
先看两个类的方法: >>> class nc(): def __init__(self): self.name ='tester' #name变量加self >>> ...
- Python类,域,方法,对象,继承
类和对象: 是面向对象编程的两个主要方面,类创建一个新类型,而对象这个类的实例.. 域: 属于一个对象或类的变量被称为域.域有两种类型: 属于每个实例(类的对象)或属于类本身.它们分别被称为实例变量和 ...
- python - 类的方法
类的方法分为:普通方法. 静态方法和类方法 调用方式 特征 普通方法 由对象去调用执行,属于类 至少一个self,对象调用 静态方法 属于类,但通过类来调用,不依赖于任何对象,方法内部不需要对象封 ...
- python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)
网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 与类和实例无绑定关系的function都属于函数(function): 与类和实例有绑定关系的function都属于方法(meth ...
- 第8.7节 Python类__new__方法和构造方法关系深入剖析:__new__方法执行结果对__init__的影响案例详解
一. 引言 前面章节介绍了类中的构造方法和__new__方法,并分析了二者执行的先后顺序关系.__new__方法在__init__方法前执行,__new__方法执行后才返回实例对象,也就是说__new ...
- python 类和方法(面向对象)
类和方法 name = "Jack" city = "bejing" print("my name is %S and come from %s &q ...
随机推荐
- [BFS]P1434 [SHOI2002]滑雪
P1434 [SHOI2002]滑雪 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者 ...
- 原生对象写法,dom调用方法
1 var App = (function () { 2 var App = function () { 3 //全局变量 4 this.init(); 5 this.a = ...
- 封装一个处理 react 异常的最简 ErrorBoundary 组件 🎅
前言 从 React 16 开始,引入了 Error Boundaries 概念,它可以捕获它的子组件中产生的错误,记录错误日志,并展示降级内容,具体 官网地址. 错误边界避免一个组件错误导致整个页面 ...
- 2020 OO 第一单元总结 表达式求导
title: BUAA-OO 第一单元总结 date: 2020-03-19 20:53:41 tags: OO categories: 学习 OO第一单元通过三次递进式的作业让我们实现表达式求导,在 ...
- Hadoop完整搭建过程(二):伪分布模式
1 伪分布模式 伪分布模式是运行在单个节点以及多个Java进程上的模式.相比起本地模式,需要进行更多配置文件的设置以及ssh.YARN相关设置. 2 Hadoop配置文件 修改Hadoop安装目录下的 ...
- 如果你的application.properties中还存在明文密码----加密Spring Boot中的application.properties
1 概述 什么?都2020年了还在Spring Boot的配置文件中写明文密码? 虽然是小项目,明文也没人看. 明文简单快捷方便啊!!! 你看直接用户名root密码123456多么简单!!! ... ...
- kubernetes-copyFromPod
import com.google.common.io.ByteStreams; import io.kubernetes.client.Copy; import io.kubernetes.clie ...
- 微信小程序底部实现自定义动态Tabbar
多图警告!!! 最近在工作中遇到这样一个需求:微信小程序底部的Tab需要通过判断登录人的角色动态进行改变,想要实现这个功能依靠小程序原生的Tabbar是不可能实现的了,所以研究了一下自定义Tab,这里 ...
- Zabbix三种邮箱告警配置
环境 环境 IP地址 主机名 需要安装的应用 系统版本 服务端 192.168.23.140 zabbix lamp zabbix_server zabbix_agent CentOS 8 客户端 1 ...
- pyqt5 菜单栏+信息提示框
前言 使用pyqt5 添加菜单栏 单击菜单栏 弹出信息框(MessageBox用法) 菜单栏 功能 Action是Qt中单独引入的一个对象,对应QAction类.Action表示一个独立的操作,是将界 ...