美文网首页python入门
python第41课练习—魔法方法:构造和析造

python第41课练习—魔法方法:构造和析造

作者: YoYoYoo | 来源:发表于2019-06-15 13:40 被阅读0次

    1、是哪个特征让我们一眼就认出这货是魔法方法?

    答:魔法方法总是被双下划线包围,例如__init__。

    2、类实例化对象所调用的第一个方法是什么?

    答:__new__是在一个对象实例化的时候所调用的第一个方法。它跟其他的魔法方法不同,它的第一个参数不是self,而是这个类(cls),而其他的参数会直接传递给__init__方法的。

    3、什么时候我们需要在类中明确写出__init__方法?

    答:当我们的实例对象需要有明确的初始化步骤的时候,你可以在__init__方法中部署初始化的代码。
    举个例子:

    # 我们定义一个矩形类,需要长和宽两个参数,拥有计算周长和面积两个方法
    # 我们需要在对象初始化的时候拥有“长”和“宽”两个参数,因此我们需要重写__init__方法
    # 因为我们说过,__init__方法是类在实例化成对象的时候首先会调用的一个方法,大家可以理解吗?
    
    class Rectangle:
        def __init__(self,x,y):
            self.x = x
            self.y = y
        def getPeri(self):
            return (self.x + self.y)*2
        def getArea(self):
            return self.x * self.y
    
    rect = Rectangle(3,4)
    a = rect.getPeri()
    b = rect.getArea()
    print(a)
    print(b)
    
    >>>14
    >>>12
    

    4、请问下边代码存在什么问题?

    class Test:
        def __init__(self,x,y):
            return x + y
    

    答:编程中需要注意到__init__方法的返回值一定是None,不能是其他!
    如:

    >>> t = Test(3,4)
    Traceback (most recent call last):
      File "<pyshell#3>", line 1, in <module>
        t = Test(3,4)
    TypeError: __init__() should return None, not 'int'
    

    5、请问__new__方法是负责什么任务?

    答:__new__方法主要是在一个对象实例化时返回一个实例对象,通常是参数cls这个类的实例化对象,当然你也可以返回其他对象。

    6、__del__魔法方法什么时候会被自动调用?

    答:如果说__init__和__new__方法是对象的构造器的话,那么Python也提供了一个析构器,叫做__del__方法。当对象将要被销毁的时候,这个方法就会被调用。
    但一定要注意的是,并非del x 就相当于自动调用x.__del__(),__del__方法是当垃圾回收机制回收这个对象的时候调用的。

    练习

    1、小李做事常常丢三落四的,写代码也一样,常常打开了文件又忘记关闭。你能不能写一个FileObject类,给文件对象进行包装,从而确认在删除对象时文件能自动关闭?

    答:只要做到灵活搭配__init__和__del__魔法方法,即可做到收放自如。
    代码清单:

    class FileObject:
        '''给文件对象进行包装从而确认在删除时文件流关闭'''
    
        def __init__(self,filename = 'sample.txt'):
            # 读写模式打开一个文件
            self.new_file = open(filename,'r+')
    
        def __def__(self):
            self.new_file.close()
            del self.new_file
    

    2、按照以下要求,定义一个类实现摄氏度到华氏度的转化(转化公式:华氏度 = 摄氏度*1.8 + 32)

    要求:我们希望这个类尽量简练的实现功能,如下:

    >>>print(C2F(32))
    89.6
    

    答:为了尽量简练的实现功能,我们采取了“偷龙转凤”的小技巧,在类进行初始化之前,通过“掉包”arg参数,让实例对象直接返回计算后的结果。
    代码清单:

    class C2F(float):
        "摄氏度转换为华氏度"
        def __new__(cls,arg = 0.0):
            return float.__new__(cls,arg * 1.8 + 32)
    

    3、定义一个类继承于int类型,并实现一个特殊功能:当传入的参数是字符串的时候,返回该字符串中所有字符的ASCⅡ码的和(使用ord()获得一个字符的ASCⅡ码值)

    实现如下:

    >>> print(Nint(123))
    123
    >>> print(Nint(1.5))
    1
    >>> print(Nint('A'))
    65
    >>> print(Nint('FishC'))
    461
    

    代码清单:

    class Nint(int):
        def __new__(cls,arg = 0):
            if isinstance(arg,str):
                total = 0
                for each in arg:
                    total += ord(each)
                arg = total
            return int.__new__(cls,arg)
    

    相关文章

      网友评论

        本文标题:python第41课练习—魔法方法:构造和析造

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