py小强

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

7.15 内置方法(method)

类里面的函数就叫做方法。

  1. isinstance(obj, cls)
    obj对象是不是cls类的实例

  2. issubclass(sub, super)
    sub类是不是super类的子类

  3. 反射的方法

    • hasattr(o, name)
    • getattr(o, name, [default])
    • setattr(o, name, value)
    • delattr(o, name)
  4. item系列:把对象的访问模拟成字典类型

    • __getitem__(self, item)
    • __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')  # 因为item是字符串类型,需要这样调用。用get方法,没有相应属性也不会报错
            # if hasattr(self, item):  # 这样也可以
                # return getattr(self, item) 
            
        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('aaa')
    print(obj.__dict__)
    
    # 用字典的方式调用属性:getitem
    obj['name']  # 相当于obj.name
    print(obj.__dict__)
    
    # 用字典的方式设置属性:setitem
    obj['name'] = 'bbb'  # obj.name = 'bbb'
    obj['age'] = 11
    print(obj.__dict__)
    
    # 用字典的方式删除属性:
    del obj['age']
    print(obj.__dict__)
    

    执行结果:

    {'name': 'aaa'}
    getitem...
    name
    {'name': 'aaa'}
    setitem...
    name bbb
    setitem...
    age 11
    {'name': 'bbb', 'age': 11}
    delitem...
    age
    {'name': 'bbb'}
    
  5. __str__(self)
    定义打印时候的格式,

    # python中的dict类,在打印对象的时候会输出字典格式的结果
    # 但是我们定义的类,打印对象的时候只会显示是一个对象和其内存地址
    # __str__内置方法就可以让我们自定义打印的方式
    
    class People:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        
        def __str__(self):  # __str__必须返回一个字符串类型,不然报错
            print('__str__...')
            return '{name:%s,age:%s}' % (self.name, self.age,)
            
    p1 = People('aaa', 11)
    print(p1)  # 这时候会打印__str__定义的结果
    

    执行结果:

    __str__...
    {name:aaa,age:11}
    
  6. __del__
    回收跟对象相关联的资源时使用
    触发时机:会在删除其绑定对象之前,先触发__def__()方法。

    # python中的open方法,实际上内部是python程序向os发送请求后,os打开的文件(应用程序是无法直接操作硬盘上的数据的,必须经过os)
    # 所以当你关闭应用程序前,也必须告诉os关闭对文件的操作(释放os的操作)
    
    # 我们模拟一下open方法来说明__del__的作用
    
    class Open:
        def __init__(self, filename):
            print('对os发送请求,os打开文件...')
            self.filename = filename
            
        def __del__(self):  # 在这个方法里可以定义一些回收os资源的操作
            print('__del__...')
            
    f = Open('test.txt')  # 模拟打开文件
    
    # def f  # 如果在这里删除 f ,那么 __del__会在这里触发
    
    print('----main----')  # 这里程序已经执行完毕,python的自动垃圾回收机制会回收 f 对象,但是os的操作并不能回收
    
    # 从执行结果我们可以知道,__del__最后的print之后执行,也就是自动回收 f 的时候(确切上说是 f 被回收之前)执行__del__
    
    

    执行结果:

    对os发送请求,os打开文件...
    ----main----
    __del__...
    
posted on 2019-07-18 22:30  py小强  阅读(94)  评论(0)    收藏  举报