python 魔方方法 (1) 构造与析构

整理自小甲鱼鱼C论坛

构造与析构

__init__(self[,...])

__init__()相当于其他面向对象编程语言的构造方法,也就是类在实例化成对象时,首先会调用的方法

class Rectangle:
def __init__(self, x, y):
self.x = x
self.y = y

def getArea(self):
return self.x * self.y
>>> rect = Rectangle(3, 4) #这里输入__init__()中需要的参数。
>>> rect.getArea()
12

需要注意,__init__()方法不能return值,只能return None.

__new__(cls[,...])

__new__()方法是对象实例化时,调用的第一个方法。他的第一个参数不self,而是类cls同时,其他参数会传入__init__()

__new__()需要返回一个实例对象,通常是cls这个类实例化的对象,当然也可以返回其他对象。

通常在继承一个不可变的类型的时候,需要使用__new__()方法。如下代码:

class CapStr(str):
def __new__(cls, string):
string = string.upper()
return str.__new__(cls, string)
>>> a = Capstr('abc')
>>> a
'ABC'

__del__(self)

__del__()方法只有在垃圾回收机制激活时才能调用,即对应数据完全删除以后。

class DelPrint():
def __del__(self):
print('__delf__()方法被调用')

>>> A = DelPrint()
>>> B = A
>>> C = B
>>> del B
>>> del C
>>> del A
__delf__()方法被调用

练习:

(1) 写一个FileObject类,给文件对象进行包装,从而确认在删除对象时文件能自动关闭。

class FileObject:
def __init__(self, FILE='example.txt'):
self.FILE = open(FILE, 'r')
del __del__(self):
self.FILE.close()
del self.FILE

(2) 定义一个摄氏度到华氏度转换(华氏度 = 摄氏度*1.8 + 32)。

class C2F(float):
def __new__(cls, C = 0.0):
return float.__new__(cls, C * 1.8 + 32)

(3) 定一个一个类继承int类型,当传入参数是字符串时候,返回该字符串所有字符的ASCII码的和(ord())

class TOASCII(int):
def __new__(cls, INPUT = ''):
if isinstance(INPUT, str):
total = 0
for each in INPUT:
total += ord(each)
INPUT = total #最后要赋值回INPUT
return int.__new__(cls, INPUT)

>>> print(TOASCII('A'))