zoukankan      html  css  js  c++  java
  • python之路(10)类的内置函数

    目录


    isinstance(obj,cls)和issubclass(sub,super)

    isinstance(obj,cls)  检查obj是否是cls的对象

    issubclass(sub,super)  检查sub子类是否是super类的子类

    __setitem__、__getitem__和__delitem__

    class test:
        def __getitem__(self, item):
            print("getitem")
            return getattr(self,item)
    
        def __setitem__(self, key, value):
            print("setitem")
            setattr(self,key,value) #将值加到属性字典中
    
        def __delitem__(self, key):
            print("delitem")
            delattr(self,key)
    
    t1 = test()
    
    #赋值
    t1['name'] = 'chen' #setitem
    
    #取值
    t1['name'] #getitem
    
    #删除
    del t1['name'] #delitem

    __str__和__repr__

    __str__  当print()输出实例时调用,类似java里的toString()方法

    class test:
        def __str__(self):
            return "这里是__str__"
    
    t1 = test()
    print(t1) #这里是__str__

    __repr__  在pathon解释器中,直接打印实例对象触发。如果__str__没有定义时会调用__repr__,如果__str__有定义时会优先调用__str__

    class test:
        # def __str__(self):
        #     return "这里是__str__"
        def __repr__(self):
            return "这里是__repr__"
    
    t1 = test()
    print(t1) #这里是__repr__

    __format__  

    __format__ 字符串格式化输出 format() 时调用 

    #自定制格式化输出
    format_dict={
        'ymd':'{0.year}{0.mon}{0.day}',
        'y-m-d':'{0.year}-{0.mon}-{0.day}',
        'y:m:d':'{0.year}:{0.mon}:{0.day}'
    }
    
    class test:
        def __init__(self,year,mon,day):
            self.year = year
            self.mon = mon
            self.day = day
    
        def __format__(self, format_spec): #format()---->__format__()
            if not format_spec:
                format_spec = 'ymd'
            return format_dict[format_spec].format(self)
    
    t1 = test(2018,11,30)
    
    print(format(t1)) #20181130
    print(format(t1, "y-m-d")) #2018-11-30
    print(format(t1, "y:m:d")) #2018:11:30
    

    __stols__  

     在通过类生成实例对象,每个实例都会生成一个独立的属性字典,为了节省内存空间,定义__stols__方法取代__dict__进行统一管理,作为一个内存优化工具

     限制属性的创建,只能创建__stols__提供的属性

    class test:
        __slots__ = ['name'] 
    
    t1 = test() #由这个类产生的类不再具有__dict__属性字典
    t1.name = 'chen'
    print(t1.name) #chen
    print(t1.__slots__ ) #['name']
    print(t1.__dict__ ) # AttributeError: 'test' object has no attribute '__dict__'
    #限制属性的创建
    t1.age = 18 #AttributeError: 'test' object has no attribute 'age'
    

    __module__和__class__

    __module__  返回实例的模块

    __class__  返回实例的类

    __del__(析构函数)

    __del__  实例对象被删除,系统回收内存时调用

    __call__ 

    实例对象加括号这样的形式调用,会执行__call__方法 

    注:类生成实例对象本质也是调用call方法

    class test:
        def __call__(self, *args, **kwargs):
            print("call方法")
    t1 = test()
    t1() #call方法
    

    __iter__和__next__  

    迭代器协议的两个内置方法

    class test:
        def __init__(self,n):
            self.n=n
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.n == 13:
                raise  StopIteration('终止了') #迭代器抛出异常停止迭代
            self.n += 1
            return self.n
    
    t1 = test(10)
    #for循环会捕捉StopIteration异常,停止循环
    for i in t1:  #f1.__iter__ 
        print(i)
    

     

  • 相关阅读:
    loaded some nib but the view outlet was not set
    指标评比
    IOS DEVELOP FOR DUMMIES
    软件测试题二
    javascript select
    DOM节点类型详解
    mysql操作
    UVA 10055
    solutions for 'No Suitable Driver Found For Jdbc'
    解决git中文乱码问题
  • 原文地址:https://www.cnblogs.com/shuzhixia/p/10042257.html
Copyright © 2011-2022 走看看