zoukankan      html  css  js  c++  java
  • 9.4、__del__、__doc__、__dict__、__module__、__getitem__、__setitem__、__delitem__、__str__、__repr__、__call__


    相关内容:

    __del__、__doc__、__dict__、__module__、__getitem__、__setitem__、__delitem__、__str__、__repr__、__call__

    首发:posted @ 2018-02-07 01:08

    修改:

    1. 2018-02-14 13:57:增加__repr__

    __del__:

    • 被称为析构函数
    • 当删除一个对象时,python解释器会默认调用__del__()方法
    import gc
    class Dog(object):
        def __init__(self,name):
            self.name=name
        def __del__(self):
            print("删除成功")
        def wang(self):
            print("汪汪汪")
    
    d1=Dog("小黑")
    d1.wang()
    # d1=None
    # del d1
    #以上两种都可以删除,或者程序结束也会释放内存
    
    # d1.wang()#删除后这里会报错

    __doc__ :

    • 类的文档字符串
    class Dog:
        """这是这个类的说明
        """
        def __init__(self,name):
            self.name=name
    
    d1=Dog("奥巴马")##创建对象,传入__init__所需的变量,self默认自动传入
    
    print(Dog.__doc__)
    
    
    --------------------------
    结果:
    这是这个类的说明

    __dict__ :

    • 类的属性,包含类的相关变量和方法
    class Dog:
        #self 代表的是类的实例,代表当前对象的地址
        def __init__(self,name):##称为类的构造函数,进行初始化成员变量
            self.name=name
        def bulk(self):###自定义函数
            print("%s:汪汪!"%self.name)
    
    d1=Dog("奥巴马")##创建对象,传入__init__所需的变量,self默认自动传入
    
    print(Dog.__dict__)###类相关的变量,函数
    print(d1.__dict__)##只有自身的实例变量
    
    
    -----------------------------------------
    {'__module__': '__main__', '__init__': <function Dog.__init__ at 0x000002B6950FC9D8>, 'bulk': <function Dog.bulk at 0x000002B6950FCA60>, '__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>, '__doc__': None}
    {'name': '奥巴马'}


    __module__:

    • 类定义所在的模块:源文件中会显示__main__,导入为模块时为类定义所在的模块


    __getitem__:

    • 凡是在类中定义了这个__getitem__ 方法,那么它的实例对象(假定为p),可以像这样 p[key] 取值,当实例对象做p[key] 运算时,会调用类中的方法__getitem__。

    image

    __setitem__:

    • 使对象可以使用obj[key]=value来调用__setitem__进行操作

    image

    __delitem__:

    • 使对象可以使用del obj[key]来删除属性

    image

    class A(object):
        def __getitem__(self, key):
            print('__getitem__', key)
        def __setitem__(self, key, value):
            self.value=value
            print('__setitem__', key, value)
        def __delitem__(self, key):
            print('__delitem__', key)
    
    obj = A()
    
    result = obj['k1']   # 触发__getitem__
    obj['k2'] = 'neo'   # 触发__setitem__
    print(obj.value)  #设置的可以获取
    del obj['k1']        #触发__delitem__
    image


    __str__:

    • 直接调用对象时,显示的字符串

    image

    class Dog(object):
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return self.name
    d=Dog("apple")
    print(d)
    class Dog(object):
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return "这是一个?"
    d=Dog("apple")
    print(d)


    __repr__:

    • __repr__与__str__的功能基本一致,不同的是,在交互式环境中,直接输入类的一个实例对象也能得到结果。
    • 而如果类中没有定义__str__,那么此时__repr__就相当于__str__
    • 而基本上,repr的功能使用较少,主要用于debug,其他情况都可以使用__str__来代替
    >>> class Dog(object):
        def __init__(self,name):
            self.name=name
        # def __str__(self):
        #     return "这是一个?"
        def __repr__(self):
            return "这是一个?"
    
    >>> d=Dog("apple")
    >>> d
    这是一个?
    >>> print(d)#没有__str__的情况
    这是一个?


    __call__:

    • 一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。

    image

    class call_test(object):
        def __call__(self, *args, **kwargs):
            print("hello ",args,kwargs)
    
    
    c=call_test()
    c()

  • 相关阅读:
    Python3抓取 深圳房地产均价数据,通过真实数据为购置不动产做决策分析(二)
    Python3抓取 深圳房地产均价数据,通过真实数据为购置不动产做决策分析(一)
    学习Make your own neural network 记录(一)
    Python3 爬取Boss直聘网 工作基本信息(数据清洗)
    Python3 爬虫爬取中国图书网(淘书团) 进阶版
    Python3 爬虫爬取中国图书网(淘书团) 记录
    修改Linux最大Socket连接限制
    linux递归删除某个文件夹
    虚拟机安装Linux小技巧
    ext/hash_map 报告过期错误和警告 deprecated or antiquated header
  • 原文地址:https://www.cnblogs.com/progor/p/8424898.html
Copyright © 2011-2022 走看看