Python学习日记(十五)


构造和析构

构造:

  • __init__(self)
    • 一般要对某个类进行初始化时才会重写__init__函数
    • 魔法方法总是被双下划线包围,比如__init__
    • __init()__返回类型为None所以不能在__init__函数中return
  • __new()__(cls[,...])
  • 实例化对象时第一个调用的方法,返回一个对象
  • 当我们继承一个不可变类时又要进行修改时可重写次方法,不然一般不用重写
  • class CapStr(str):
        def __new__(cls,string):
            string=string.upper()
            return str.__new__(cls,string)
    
    a=CapStr("i love you")
    print(a)
    I LOVE YOU
    

析构:

  • __del__(self)
  • 并不是del时就调用del方法,只有当最后一个对象被del时才会
  • 当对象要被销毁时会自动调用此方法,即一个垃圾回收机制,当没有任何变量去引用某个对象时,就自动调用此方法销毁对象
  • >>> class C:
    	def __init__(self):
    		print("我是__init__")
    	def __del__(self):
    		print("我是__del__")
    
    >>> a=C()
    我是__init__
    >>> b=a
    我是__del__
    >>> c=a
    >>> del b
    >>> del c
    >>> del a
    我是__del__

模块

  • 容器:对数据的封装;函数:语句的封装;类:方法和属性的封装;模块:程序(代码 )的封装
  • 可实现代码的重用(一个模块重复使用)
  • 导入模块:import  模块名 ;import 模块名 as 新名字
  • 调用模块方法:模块名.方法名();新名字.方法名()

 

  • __ name__ = '__ main__'
  • 一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在 if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。
  • # p13_7.py
    def c2f(cel):
        fah = cel * 1.8 +32
        return fah
    
    def f2c(fah):
        cel = (fah - 32) / 1.8
        return cel
    
    def test():
        print("测试,0摄氏度 = %.2f 华氏度" % c2f(0))
        print("测试,0华氏度 = %.2f 摄氏度" % f2c(0))
    
    if __name__ == '__main__':
        test()
  • 搜索路径
  • 写好的模块应该放在哪里?我们可以放在和导入这个模块文件的源代码同一个文件夹内,还可以自己定义路径。
  • >>> import sys
    >>> sys.path
    ['', '/Users/liujin/Documents', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/easygui-0.98.0_UNRELEASED-py3.7.egg']
    >>> sys.path.append('/Users/liujin/Documents/virtualenv3.7Demo/ven2')
    >>> sys.path
    ['', '/Users/liujin/Documents', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/easygui-0.98.0_UNRELEASED-py3.7.egg', '/Users/liujin/Documents/virtualenv3.7Demo/ven2']
    >>> import p13_7 as tc
    >>> print("32摄氏度 = %.2f 华氏度" % tc.c2f(32))
    32摄氏度 = 89.60 华氏度
    >>> 
  • 1??创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字;
    2??在文件夹中创建一个__ init__.py模块文件,内容可以为空;
    3??将相关的模块放入文件夹中。
  • 下面就是从M1包中导入p13_7模块: