梦相随1006

版权归 梦相随1006 所有,未经 https://www.cnblogs.com/xin1006 作者许可,严禁转载

导航

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
>>>

 

posted on 2015-11-16 19:58  梦相随1006  阅读(250)  评论(0编辑  收藏  举报