• Python 中的特殊双下划线方法


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

    __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__()方法是否存在,存在即执行它。不存在再查看有没有默认参数,有则返回,没有则报错。

    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__来代替输出
    注意:这俩方法的返回值必须是字符串,否则抛出异常
    '''
  • 相关阅读:
    操作数据库pymysql
    深度学习-目标检测(Fast R-CNN)
    解释--全连接层输入大小固定
    深度学习-目标检测(IOU)
    深度学习-目标检测(SPPNet)
    深度学习-目标检测(R-CNN)
    机器学习-Whitening(白化)
    Win10 将slim加入PYTHONPYTH
    tensorboard 使用
    卷积神经网络--padding
  • 原文地址:https://www.cnblogs.com/caisong/p/10187122.html
Copyright © 2020-2023  润新知