• 面向对象进阶——内置方法(二)


    七、__setitem__, __getitem__, __delitem__

      当我们对类的属性item进行下标的操作时,首先会被__getitem__()、__setitem__()、__delitem__()拦截,从而进行我们在方法中设定的操作,如赋值,修改内容,删除内容等等。

      __getitem__(self,key):返回键对应的值
      __setitem__(self,key,value):设置给定键的值
      __delitem__(self,key):删除给定键对应的元素

    class Foo:
        def __init__(self, name):
            self.name = name
    
        def __getitem__(self, item):
            # print('getitem...')
            #print(item)
    
            return self.__dict__.get(item)  # 字典get方法有则取值,无也不会报错
    
        def __setitem__(self, key, value):
            # print('setitem...')
            # print(key,value)
            self.__dict__[key] = value
    
        def __delitem__(self, key):
            # print('delitem...')
            # print(key)
            # self.__dict__.pop(key)
            del self.__dict__[key]
    
    obj = Foo('egon')
    
    
    # 1、查看属性
    # obj.属性名
    # item系列就是为了把对象模拟成像字典一样,就可以像字典一样访问
    obj['name']   # 以这种形式完成 obj.name取值的效果
    """
    getitem...
    name
    """
    print(obj['name'])
    
    # 2、设置属性
    # obj.sex = 'male'
    obj['sex'] = 'male'
    
    print(obj.__dict__)
    print(obj.sex)
    
    # 3、删除属性
    # del obj.name
    del obj['name']
    print(obj.__dict__)
    """
    {'sex': 'male'}
    """
    八、__str__, __repr__,  __format__

      改变对象的字符串显示__str__,__repr__
      自定制格式化字符串__format__

    d = dict({'name' : 'egon'})
    print(isinstance(d, dict))  # True,d是dict类的实例
    print(d)
    
    class Foo:
        pass
    obj = Foo()
    print(obj)
    """ 同样是打印对象,显示形式完全不同,打印总是希望像前一种有提示功能。
    {'name': 'egon'}
    <__main__.Foo object at 0x10401ad68>
    """
    
    # __str__方法定义后,会在打印对象的时候,触发这个对象下的__str__方法,把字符串的结果作为打印的结果
    class People:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def __str__(self):  # 必须return一个字符串
            # print("触发__str__方法:")
            return '<name:%s,age:%s>' %(self.name, self.age)
    
    
    obj = People('egon', 18)
    print(obj)
    """
    <name:egon,age:18>
    """
    细究__str__
    format_dict={
        'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型
        'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址
        'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名
    }
    class School:
        def __init__(self,name,addr,type):
            self.name=name
            self.addr=addr
            self.type=type
    
        def __repr__(self):
            return 'School(%s,%s)' %(self.name,self.addr)
        def __str__(self):
            return '(%s,%s)' %(self.name,self.addr)
    
        def __format__(self, format_spec):
            # if format_spec
            if not format_spec or format_spec not in format_dict:
                format_spec='nat'
            fmt=format_dict[format_spec]
            return fmt.format(obj=self)
    
    s1=School('oldboy1','北京','私立')
    print('from repr: ',repr(s1))
    print('from str: ',str(s1))
    print(s1)
    
    '''
    str函数或者print函数--->obj.__str__()
    repr或者交互式解释器--->obj.__repr__()
    如果__str__没有被定义,那么就会使用__repr__来代替输出
    注意:这俩方法的返回值必须是字符串,否则抛出异常
    '''
    print(format(s1,'nat'))
    print(format(s1,'tna'))
    print(format(s1,'tan'))
    print(format(s1,'asfdasdffd'))
    学校类
    date_dic={
        'ymd':'{0.year}:{0.month}:{0.day}',
        'dmy':'{0.day}/{0.month}/{0.year}',
        'mdy':'{0.month}-{0.day}-{0.year}',
    }
    class Date:
        def __init__(self,year,month,day):
            self.year=year
            self.month=month
            self.day=day
    
        def __format__(self, format_spec):
            if not format_spec or format_spec not in date_dic:
                format_spec='ymd'
            fmt=date_dic[format_spec]
            return fmt.format(self)
    
    d1=Date(2016,12,29)
    print(format(d1))
    print('{:mdy}'.format(d1))
    自定义format练习
    class A:
        pass
    
    class B(A):
        pass
    
    print(issubclass(B,A)) #B是A的子类,返回True
    
    a1=A()
    print(isinstance(a1,A)) #a1是A的实例
    issubclass和isinstance
    九、slots
  • 相关阅读:
    算法
    jquery-lazyload延迟加载图片
    配置图片服务器
    Flutter开发之dart语言从入门到精通(从入坑到入土)
    阿里淘系技术分享:Flutter 快速上手方法!!!
    如何优雅的处理 Android 重复点击 [建议收藏]
    还谈论Android的前景?根本没什么好问的……
    一个商业级智能家居 Android 开源项目分享
    【前端算法】拼多多技术面试算法题分享
    美团Android岗面试真题:手写红黑树详解
  • 原文地址:https://www.cnblogs.com/xiugeng/p/8940714.html
Copyright © 2020-2023  润新知