码迷,mamicode.com
首页 > 编程语言 > 详细

Python 中的特殊双下划线方法

时间:2019-03-04 11:35:14      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:递归   实例名   not   流程   err   tle   init   pytho   ssi   

python类内部部分双下划线特殊方法

__setattr__, __getattr__, __delattr__, hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()

主程序如下:
class Foo:
def _inif(self,pname):
 self.pname = pname
def func():
 print(im 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__()方法是否存在,存在即执行它。不存在再查看有没有默认参数,有则返回,没有则报错。

技术图片

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 中的特殊双下划线方法

标签:递归   实例名   not   流程   err   tle   init   pytho   ssi   

原文地址:https://www.cnblogs.com/caisong/p/10187122.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!