Python 中的函数的双下划线“__”

  Python中最常见的是类中的带有双下滑线的函数是 __init__()最开始只是知道 有初始化的作用,这里从原理上总结一下。

  在Python中,由这些名字组成的集合所包含的方法称为特殊方法。如果对象实现了这些方法中的某一个,那么这个方法会在特殊情况下(确切的说是根据名字)被Python调用。而几乎没有直接调用它们的必要。

  一、首先讨论__init__(),标准来说它是类的构造方法。当一个对象被创建后,会立即调用构造方法。

  

class Test:
    def __init__(self):
        self.a=42

结果是:

      >>> t=Test()
  >>> t.a
  42

 

  二、接下来讨论常见的特殊方法的集合,它可以创建行为类似于序列或映射的对象。基本的序列和映射的规则很简单,但如果要实现它们的全部功能就需要实现很多魔法函数。

幸好,还是有一些捷径的。

  简单的概述,我用的不多,感兴趣的自己查

 

      __len__(self):这个方法应该返回集合中所含项目的数量。

  __getitem__(self):这个方法返回与所给键对应的值。

  __setitem__(self):这个方法应该按一定的方式存储和key相关的value。

      __delitem__(self):这个方法在对一部分对象使用del语句时会调用。

 

三、python也是面向对象的,一个功能可以包含很多包(Package),一个包中可以有很多模块(Model),模块主要是为了实现代码的重用性,当一个模块写完后,我们需要调试(通常单元测试就是这么来的),

那么如何才能让调试的结果只在运行(调试)该模块是输出,而在该模块被调用时不输出呢?为了实现这点,需要使用__name__变量:

>>> __name__
'__main__'

写了一个模块test2.py

def hello():
    print("hello world")

在另外一个模块中引入该模块

import test2

print(test2.__name__)

结果是 >>>test2

如你所见 在“主程序”(包括解释器的交互式提示符在内)中,变量__name__的值是‘__main__’。而在导入的模块中,这个值就被设定为模块的名字。因此,为了让模块的测试代码更好用,可以放在"if"语句中:

def hello():
    print("hello world")
    
if __name__ =="__main__":
    hello()

当其他模块调用该模块时 if语句并不会执行(__name__不等于__main__)

 

posted @ 2018-01-20 22:16  了不起的小白  阅读(5558)  评论(0编辑  收藏  举报