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

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__)