主要讲类的内部方法 __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__()的更多相关文章

  1. python类及其方法

    python类及其方法 一.介绍 在 Python 中,面向对象编程主要有两个主题,就是类和类实例类与实例:类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中 ...

  2. python 魔法方法之:__getitem__ __setitem__ __delitem__

    h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...

  3. python中的__len__,__getitem__ __setitem__ __delitem__ __contains__

    可变集合需要实现: __len__  __getitem__    __setitem__  __delitem__不可变集合需要实现: __len__  __getitem__ __len__:返回 ...

  4. Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别

    先看两个类的方法: >>> class nc(): def __init__(self): self.name ='tester' #name变量加self >>> ...

  5. Python类,域,方法,对象,继承

    类和对象: 是面向对象编程的两个主要方面,类创建一个新类型,而对象这个类的实例.. 域: 属于一个对象或类的变量被称为域.域有两种类型: 属于每个实例(类的对象)或属于类本身.它们分别被称为实例变量和 ...

  6. python - 类的方法

    类的方法分为:普通方法. 静态方法和类方法   调用方式 特征 普通方法 由对象去调用执行,属于类 至少一个self,对象调用 静态方法 属于类,但通过类来调用,不依赖于任何对象,方法内部不需要对象封 ...

  7. python中函数和方法区别,以及如何给python类动态绑定方法和属性(涉及types.MethodType()和__slots__)

    网上有很多同义但不同方式的说法,下面的这个说法比较让你容易理解和接受 与类和实例无绑定关系的function都属于函数(function): 与类和实例有绑定关系的function都属于方法(meth ...

  8. 第8.7节 Python类__new__方法和构造方法关系深入剖析:__new__方法执行结果对__init__的影响案例详解

    一. 引言 前面章节介绍了类中的构造方法和__new__方法,并分析了二者执行的先后顺序关系.__new__方法在__init__方法前执行,__new__方法执行后才返回实例对象,也就是说__new ...

  9. python 类和方法(面向对象)

    类和方法 name = "Jack" city = "bejing" print("my name is %S and come from %s &q ...

随机推荐

  1. for what? while 与 until 差在哪?-- Shell十三问<第十三问>

    for what? while 与 until 差在哪?-- Shell十三问<第十三问> 最后要介绍的是 shell script 设计中常见的"循环"(loop). ...

  2. 全面了解Vue3的 ref 和相关函数和计算属性

    基础类型的响应性 -- ref 在vue3里面,我们可以通过 reactive 来实现引用类型的响应性,那么基础类型的响应性如何来实现呢? 可能你会想到这样来实现: const count = rea ...

  3. Apache SkyWalking 告警配置指南

    Apache SkyWalking Apache SkyWalking是分布式系统的应用程序性能监视工具(Application Performance Management,APM),专为微服务.云 ...

  4. ThoughtWorks首席咨询师带你一站通关中台

    大家都在谈中台,是当下一个热议的话题,但是我们最关心的两个基本问题还是没有答案.一个是中台的概念,依然是见仁见智,始终没有一个统一的见解:另一个是中台的落地,更是鲜有人谈. 拨开当下有关中台的层层迷雾 ...

  5. html5 video/audio 标签

    一般来说推荐使用,第三方的媒体播放库[例如 videojs 等],这些库的ui界面,js控制都已写好,功能也扩展的比较丰富 ,直接参考文档使用更加的高效! 这里还是 记录一下 html 原生 vide ...

  6. PAT A1025 考生排名问题

    题目要求:有n个考场,每个考场有若干个考生,现给出各个考场中考生的准考证号与分数,按照分数从高到低排序,并按顺序输出所有考生的准考证号,排名,考场号以及所在的考场排名 #include<cstd ...

  7. 强大的工具(一):Capslock+ 2.x版本

    2020.07.09 更新 作者更新了3.x版本,因此更新了3.x版本的博客,可以戳这里. 本篇文章介绍的是2.x版本. 1 Capslock+简介 Capslock+利用了键盘少用的Capslock ...

  8. ISODateTimeFormat 转换2019-08-15T00:36:49.366456463Z 日期格式

    import java.text.*; import java.text.SimpleDateFormat; import java.util.*; import org.joda.time.Date ...

  9. TCP:与UDP区别、三次握手、四次挥手、Socket 编程

    1. TCP 基本认识 TCP 头部格式 为什么需要 TCP 协议?TCP 工作在哪一层? 什么是 TCP ? 什么是 TCP 连接? 如何唯一确定一个 TCP 连接呢? 有一个 IP 的服务器监听了 ...

  10. E - Minimal Subarray Length(连续区间和)

    题目链接 题意:给出n个数,求加和大于x的最短区间的区间长度. 如果前i个数字和为y,那么如果前j数字的和小于等于y-x,那么i-j就是一种可能的情况,我们对于所有的i找出前面最大的j就可以了,因为数 ...