>>> # 魔法方法
>>>
>>> # 魔法方法总是被双下划线包围,例如 __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
>>>

Python学习笔记009_构造与析构的更多相关文章

  1. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  2. 【python学习笔记】9.魔法方法、属性和迭代器

    [python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...

  3. Python学习笔记(四)函数式编程

    高阶函数(Higher-order function) Input: 1 abs Output: 1 <function abs> Input: 1 abs(-10) Output: 1 ...

  4. Python 学习笔记(下)

    Python 学习笔记(下) 这份笔记是我在系统地学习python时记录的,它不能算是一份完整的参考,但里面大都是我觉得比较重要的地方. 目录 Python 学习笔记(下) 函数设计与使用 形参与实参 ...

  5. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  6. VS2013中Python学习笔记[Django Web的第一个网页]

    前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...

  7. python学习笔记之module && package

    个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...

  8. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

  9. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

随机推荐

  1. noip2016普及组 题解

    T1 大水题,不解释 上考场代码 #include <algorithm> #include <cstdio> using namespace std; int main() ...

  2. SSH框架通过JFreeChart实现柱状图和获取项目路径

    获取项目路径:String url= ServletActionContext.getRequest().getRealPath("/upload"); 一.直接生成的图片输出到j ...

  3. JVM 调优总结

    避免FullGC: 1.通过调整堆中新生代和幸存代大小,避免因为幸存代不足而让Minor GC后的对象进入老年代.每次Minor GC都有对象进入老年代会造成数次MinorGC后FullGC. 2.减 ...

  4. 记录-新建一个web应用的过程与曲折

    第一步/ 打开eclipse,菜单栏下,File–New–Other-,打开后找到web–Dynamic Web Project,然后单击Next. 解释一下,Dynamic ,动态的,变化的,Dyn ...

  5. jQuery遍历-祖先

    祖先是父.祖父或曾祖父等等. 通过 jQuery,您能够向上遍历 DOM 树,以查找元素的祖先. 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() ...

  6. C和C++混合编程之 extern “C”的使用

    C和C++混合编程之 extern "C"的使用 首先要明白: C++号称是C语言的超集,也确实,从语言的基本语法上,C++是包含所有C语言的语法的,而且C++为了兼容C,连C语言 ...

  7. HTTP协议知多少-关于http1.x、http2、SPDY的相关知识

    作为网站开发的基础协议,我们知道浏览器上都有输出http这四个字母,这意味着什么呢? 这就是最基础的HTTP协议. 逐浪君今天为各位大人准备了一些HTTP技术的知识,来和大家分享. 以下图为例: 这一 ...

  8. C# 获取exe、dll中的图标,支持获取256x256分辨率

    在网上找过许多文章,都没有成功获取过大图标,只能获取最大32x32.最后自己尝试了相关的windows api,终于找到一个可用的. 主要用到的C++的PrivateExtractIcons函数,具体 ...

  9. poj 1742 多重背包

    题意:给出n种面值的硬币, 和这些硬币每一种的数量, 要求求出能组成的钱数(小于等于m) 思路:一开始直接用多重背包套上去超时了,然后就没辙了,然后参考网上的,说只需要判断是否能取到就行了,并不需要记 ...

  10. Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)

    注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先 ...