美文网首页大数据 爬虫Python AI Sql
Python-构造函数、析构函数、__str__、__repr_

Python-构造函数、析构函数、__str__、__repr_

作者: 葱花思鸡蛋 | 来源:发表于2019-06-18 11:38 被阅读0次
    1.构造函数

    当创建一个对象时,一定会调用构造函数init方法,对实例化对象进行初始化操作。此时,我们可以在函数内部,进行初始化,如:属性的初始化。

    class Person:
        def __new__(cls, name, age):
            print '__new__ called.'
            return super(Person, cls).__new__(cls)
            
        def __init__(self,name,age):
            self.name = name
            self.age = age
        
    

    init其实不是实例化一个类的时候第一个被调用的方法。当使用 Person(name, age) 这样的表达式来实例化一个类时,最先被调用的方法其实是 new 方法,此方法是创建实例化对象,开辟内存空间。

    new方法接受的参数和init一样,用于创建这个类实例并把创建的实例返回,然后返回的实例再调用init方法进行初始化操作。

    new方法主要是当你继承一些不可变的类时(如:int,str,tuple),提供给你一个自定义这些类的实例化过程的途径。

    class absInt(int):
        def __new__(cls,value):
            return super(absInt,cls).__new__(cls,abs(value))
            
     
    >>> a = absInt(-3)  
    >>> a
    3
            
    
    2.析构函数

    del就是析构函数,当某一个对象的引用计数为0时,析构函数就会被调用,这个对象就会被垃圾回收器收回资源进行销毁。当没有在类中重写析构函数时,系统会自动调用父类的析构函数。

    class Person:
       def __init__(self,name):
           print('name = %s'%name);
           self.name = name
       def __del__(self):
           print('析构函数被调用了')
           
    >>> p = Person('ye')
    name = ye
    >>> p1 = p
    >>> del p1
    >>> del p
    析构函数被调用了
    
    3.str函数和repr函数

    strrepr实现类到字符串的转化,当我们打印一个对象时,输出时的结果默认情况下,并不是我们想要看到的信息,重写strrepr方法,可以添加自定义的输出,打印我们想要的信息。

    class Person:
        def __init__(self,name):
            print('name = %s'%name);
            self.name = name
        def __str__(self):
            return 'str 函数被调用了'
        def __repr__(self):
            return 'repr 函数被调用了'
        def __del__(self):
            return '析构函数被调用了'
        
    
    >>> p2 = Person('wang')
    name = wang
    >>> print(p2)
    str 函数被调用了
    >>> repr(p2)
    'repr 函数被调用了'
    >>> str(p2)
    'str 函数被调用了'
    >>> print([p2])
    [repr 函数被调用了]       
    

    上面的例子我们可以看到,使用print 输出对象的时候会调用str函数,直接使用p2输出,会调用repr函数。当对象被装入容器后,也会调用repr函数。

    另外,当我们想要显示的指定以何种方式进行类到字符串的转化,我们可以使用内置的 str() 或 repr()方法,它们会调用类中对应的双下划线方法。

    如果一个类中你没有添加str方法,只添加了repr方法,那么在打印对象时会自动调用repr方法。无论是用print()还是str(),在找不到str方法的情况下,都会调用repr方法。所以,在写自己的类的时候至少添加一个 repr 方法,这能保证类到字符串始终有一个有效的自定义转换方式。

    相关文章

      网友评论

        本文标题:Python-构造函数、析构函数、__str__、__repr_

        本文链接:https://www.haomeiwen.com/subject/sfoxqctx.html