zoukankan      html  css  js  c++  java
  • 内置方法

    内置方法

    学过的有__init__

    __str__如果不重写__str__ print打印会打印出内存地址

    如果重写了,会打印出你想要的

    __repr__跟str类似,在交互式下直接写变量名,会执行__repr__

    class Foo:
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return '['+self.name+']'
    f=Foo('nick')
    print(f.__str__())
    #相当于上面那句
    print(f)
    
    #__setattr__,__delattr__,__getattr__(重要)
    

    如果去对象中取属性,一旦取不到,会进入到__getattr__

    如果去对象中赋值属性,一旦取不到,会进入到__setattr__

    如果删除对象中的属性,会进入__delattr__

    class Foo:
        x=1
        def __init__(self,y):
            self.y=y
        def __getattr__(self, item):
            print('----> from getattr:你找的属性不存在')
        def __setattr__(self, key, value):
            print('----> from setattr')
            # self.key=value #这就无限递归了,你好好想想
            # self.__dict__[key]=value #应该使用它
        def __delattr__(self, item):
            print('----> from delattr')
            # del self.item #无限递归了
            self.__dict__.pop(item)
    #__setattr__添加/修改属性会触发它的执行
    f1=Foo(10)
    print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
    f1.z=3
    print(f1.__dict__)
    
    #__delattr__删除属性的时候会触发
    f1.__dict__['a']=3#我们可以直接修改属性字典,来完成添加/修改属性的操作
    del f1.a
    print(f1.__dict__)
    
    #__getattr__只有在使用点调用属性且属性不存在的时候才会触发
    f1.xxxxxx
    
    __item__系列  对象通过[] 中括号取值,赋值,删除值的时候,会调用
    
    class Foo:
        def __init__(self,name):
            self.name=name
        def __getitem__(self, item):
            name=getattr(self,item)
            # print(name)
            # print(self.__dict__[item])
            return name
            # return self.__dict__[item]
        def __setitem__(self, key, value):
            print('obj[key]=lqz赋值时,执行我')
            self.__dict__[key]=value
        def __delitem__(self, key):
            print('del obj[key]时,执行我')
            self.__dict__.pop(key)
    f=Foo('nick')
    print(f['name'])
    
    __enter__和__exit__
    #上下文管理器,本质原来
    with open() as f:
        pass
    
  • 相关阅读:
    forEach 终止循环
    js 解决引用赋值修改新数组导致原数组跟着改变的问题
    es6判断数组是否包含某个元素
    tab css 切换效果
    js对象赋值影响原对象
    小程序返回上个页面 修改上个页面的数据
    小程序 scroll-view scroll-x 不生效
    proxy跨域处理
    常用Dos操作指令
    django全文检索
  • 原文地址:https://www.cnblogs.com/aden668/p/11449062.html
Copyright © 2011-2022 走看看