zoukankan      html  css  js  c++  java
  • 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__)

  • 相关阅读:
    中国剩余定理
    【BZOJ】【3053】The Closest M Points
    【BZOJ】【1878】【SDOI2009】HH的项链
    【BZOJ】【2648】SJY摆棋子&【BZOJ】【2716】【Violet 3】天使玩偶
    【UOJ Easy Round #2】
    【TYVJ 五月图论专项有奖比赛】
    【BZOJ】【3301】【USACO2011 Feb】Cow Line
    【BestCoder】【Round#41】
    【BZOJ】【1046】/【POJ】【3613】【USACO 2007 Nov】Cow Relays 奶牛接力跑
    【BZOJ】【3210】花神的浇花集会
  • 原文地址:https://www.cnblogs.com/xiaobai-2017/p/8322171.html
Copyright © 2011-2022 走看看