主要讲类的内部方法 __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__来代替输出
注意:这俩方法的返回值必须是字符串,否则抛出异常
'''

最新文章

  1. [linux]如何为Virtualbox虚拟硬盘扩容(转载)
  2. Centos 6.5安装bugzilla 5.0.2
  3. Thinking in BigData 系列
  4. javascript学习7
  5. 烂泥:nginx负载均衡
  6. bzoj4305: 数列的GCD
  7. Python开发程序:简单主机批量管理工具
  8. C++中this指针的用法详解
  9. Windows 环境搭建cocos2dx 3.x Eclipse的环境
  10. iframe整理学习笔记
  11. Android Service实时向Activity传递数据
  12. [每日一题] 11gOCP 1z0-053 :2013-10-9 backup with the KEEP option....................................33
  13. c# HttpWebRequest 模拟HTTP post 传递JSON参数
  14. JavaScript(四)操作符
  15. C++实验指导
  16. [数]数学系列预习-&gt;补水题ver.
  17. GBDT、XGBOOST、LightGBM调参数
  18. jquery改变元素上下排列的顺序
  19. MVC2 ,MVC3 ,MVC4,MVC5的区别,EF的各个版本的区别;LocalDB是个啥
  20. 【Spark】session 代替 SparkConf、SparkContext和SQLContext

热门文章

  1. 我成为 Microsofti Azure MVP 啦!(ps:不是美国职业篮球)
  2. Recoil Input 光标位置被重置到末尾的问题
  3. DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验
  4. GO-02-helloworld
  5. Deployment常用命令
  6. 【.NET 与树莓派】数模转换
  7. D - 下个也是签到题 FZU - 2221(博弈)
  8. 【Nginx(二)】Nginx目录结构和常用的命令以及核心配置文件
  9. POJ1679判断最小生成树的唯一性
  10. CVE-2010-2553:Microsoft Cinepak Codec CVDecompress 函数堆溢出漏洞调试分析