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函数
str和repr实现类到字符串的转化,当我们打印一个对象时,输出时的结果默认情况下,并不是我们想要看到的信息,重写str和repr方法,可以添加自定义的输出,打印我们想要的信息。
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 方法,这能保证类到字符串始终有一个有效的自定义转换方式。
网友评论