• Python学习笔记009_构造与析构


    >>> # 魔法方法
    >>>
    >>> # 魔法方法总是被双下划线包围,例如 __init__
    >>> # 魔法方法是面向对象的Python的一切
    >>> # 魔法方法的“魔力”体现在它们总能够在适当的时候被自动调用
    >>>

    >>> # __init__(self[,...]) 相当于其它语言的构造方法,在类对象实例化时会被自动调用
    >>> # __init__方法的返回值是None,绝对不能写return

    >>> 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)
    >>> rect.getPeri()
    14
    >>> rect.getArea()
    12
    >>> 

    >>> # __init__()方法并不是第一个被调用的方法,而是 __new__(Cls[,...])
    >>>
    >>> # __new__ 方法,我们平时极少去重写它
    >>>
    >>> # 有一种情况需要重写__new__方法,就是当继承一个不可变类时,又需要进行修改
    >>>

    >>> class CapStr(str):
        def __new__(cls,string):
            string=string.upper()
            return str.__new__(cls,string)
    
        
    >>> a = CapStr("I love you !")
    >>> a
    'I LOVE YOU !'
    >>> 

    >>> # 如果说__init__方法和__new__方法是构造器的话,那么__del__方法就是析构方法
    >>> # 当对象要被销毁时 __del__(self)方法会被自动调用,它是当垃圾回收机制使用的
    >>>

    >>> # __del__方法,并不是说我们执行了 del obj就会被调用,而是所有对它的引用都被del之后,才会被调用

    >>> class C:
        def __init__(self):
            print("我是__init__方法,我被调用了...")
        def __del__(self):
            print("我是__del__方法,我被调用了...")
    
            
    
    >>> c = C()
    我是__init__方法,我被调用了...
    >>> c2 = c
    >>> del c
    >>> del c2
    我是__del__方法,我被调用了...

    >>> # time模块的一个应用
    >>>
    >>> # 这里我们重点使用 localtime()方法,它返回的是一个 时间元组,我们既可以通过索引取相应的值,也可以通过属性名取相应的值
    >>>

    time 模块详解(时间获取和转换)
    http://bbs.fishc.com/thread-51326-1-1.html

    >>> # 重写魔法方法 __str__() __rept__() ,调用对象或者print对象时就直接打印了我们返回的内容
    >>>

    >>> class A():
        def __str__(self):
            return '阿黄我爱你'
    
    >>> class B():
        def __repr__(self):
            return '杨伟,我也爱你'
    
    >>> a = A()
    >>> b = B()
    >>> 
    >>> a
    <__main__.A object at 0x0215F050>
    >>> print(a)
    阿黄我爱你
    
    >>> b = B()
    >>> b
    杨伟,我也爱你
    >>> print(b)
    杨伟,我也爱你

    >> # 基本要求:
    >>> # -- 定制一个计时器的类
    >>> # -- start和stop方法代表启动计时和停止计时
    >>> # -- 假设计时器对象t1,print(t1)和直接调用他
    >>> # t1均显示结果
    >>> # 当计时器未启动或已经停止计时,调用stop方法会给予温馨的提示
    >>> # 两个计时器对象可以进行加法运算 t1 + t2
    >>>

    >>> # Python提供了一些属性访问,会被自动调用
    >>>
    >>> # __getattr__(self,name)
    >>> # 定义当用户试图获取一个不存在的属性时的行为
    >>>
    >>> # __getattribute__(self,name)
    >>> # 定义当该类的属性被访问时的行为
    >>>
    >>> # __setattr(self,name,value)
    >>> # 定义当一个属性被设置时的行为
    >>>
    >>> # __delattr__(self,name)
    >>> # 定义当一个属性被删除时的行为

    >>> class C:
        def __getattr__(self,name):
            print("getattr")
        def __getattribute__(self,name):
            print("getattribute")
            return super().__getattribute__(name)
        def __setattr__(self,name,value):
            print("setattr")
            super().__setattr__(name,value)
        def __delattr__(self,name):
            print("delattr")
            super().__delattr__(name)
    
            
    >>> 
    >>> c = C()
    >>> c.x
    getattribute
    getattr
    >>> c.x=1
    setattr
    >>> c.x
    getattribute
    1
    >>> del c.x
    delattr
    >>> 

    # 以字典的形式列出对象的属性 __dict__

    >>>
    >>> # 写一个矩形类,默认有宽高两个属性
    >>> # 如果为一个名叫square的属性赋值,说明这是一个正方形,值就是正方形的变成,此时宽和高都应该等于边长

    class Rectangle:
        def __init__(self,width = 0,height = 0):
            self.width = width
            self.height = height
        def __setattr__(self,name,value):
            if(name=='square'):
                self.width = value
                self.height = value
            else:
                #第一种写法,调用基类的setattr方法
                #super().__setattr__(name,value)
                # 第二种写法,使用 __dict__
                self.__dict__[name] = value
        def getArea(self):
            return self.width*self.height
    
    >>> r1 =  Rectangle(4,5)
    >>> r1.getArea()
    20
    >>> r1.square = 3
    >>> r1.width
    3
    >>> r1.height
    3
    >>> r1.getArea()
    9
    >>>
    ----------- 赠人玫瑰,手有余香     如果本文对您有所帮助,动动手指扫一扫哟   么么哒 -----------


    未经作者 https://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负
  • 相关阅读:
    关于分布式事务、两阶段提交协议、三阶提交协议(转)
    高并发下产生大量,随机,唯一的字符串,并输出到文件中
    地理空间距离计算优化_附近的人(转自美团技术博客)
    Web Deploy发布网站错误 检查授权和委派设置
    mssql查询所有上下级
    mssql语句递归查找所有下级
    挖洞技巧:任意账号密码重置
    MAC卸载java 12.0.2
    mac  安装brew时报错的问题及解决方式
    致远getshell
  • 原文地址:https://www.cnblogs.com/xin1006/p/4969875.html
Copyright © 2020-2023  润新知