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

  • 相关阅读:
    清理CentOS 7系统 journal日志
    漏洞修复:CVE-2018-18311 Perl_my_setenv()中的整数溢出导致缓冲区溢出
    content-script 发送消息给background : runtime.lastError: The message port closed before a response was received.
    SEO:适应百度的页面配置
    我的 .npmrc 配置
    Cordova + Vue 环境搭建
    发布一个PHP包到Packagist, 然后使用Composer安装
    vue3 问题记录
    问题记录
    小程序
  • 原文地址:https://www.cnblogs.com/xiaobai-2017/p/8322171.html
Copyright © 2011-2022 走看看