• Python中__init__方法/__name__系统变量讲解


    __init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化。

    代码例子

    test.py
    #!/usr/bin/python
    # Filename: class_init.py
    class Person:
        def __init__(self, name):
            self.name = name
        def sayHi(self):
            print Hello, my name is, self.name

    p = Person(Swaroop)
    p.sayHi()

    # This short example can also be written as Person(Swaroop).sayHi()

    (源文件:code/class_init.py)
    输出
    $ python class_init.py
    Hello, my name is Swaroop

    它如何工作:这里,我们把__init__方法定义为取一个参数name(以及普通的参数self)。在这个__init__里,我们只是创建一个新的域,也称为name。注意它们是两个不同的变量,尽管它们有相同的名字。点号使我们能够区分它们。

    最重要的是,我们没有专门调用__init__方法,只是在创建一个类的新实例的时候,把参数包括在圆括号内跟在类名后面,从而传递给__init__方法。这是这种方法的重要之处。

    现在,我们能够在我们的方法中使用self.name域。这在sayHi方法中得到了验证。

    给C /Java/C#程序员的注释:__init__方法类似于C 、C#和Java中的 constructor

    ----------------------------------分割线------------------------------------------

    __name__系统变量指示模块应如何被加载,他的值为"__main__"时表示当前模块是被直接执行。


    由于主程序代码无论模块是被导入还是直接被执行都会运行,所以我们需要一种方式在运行时检测该模块是被导入还是被直接执行。该方式也就是__name__系统变量。如果模块是被导入,__name__的值为模块名字;如果是被直接执行,__name__的值为"__main__",此处所说的模块可以简单理解为一个.py文件。

    代码例子

    先写一个模块:

    #module.py
    def main():
      print "we are in %s"%__name__
    if __name__ == '__main__':
      main()

    这个函数定义了一个main函数,我们执行一下该py文件发现结果是打印出”we are in __main__“,说明我们的if语句中的内容被执行了,调用了main():
    但是如果我们从另外一个模块导入该模块,并调用一次main()函数会是怎样的结果呢?

    #anothermodle.py
    from module import main
    main()

    其执行的结果是:we are in module
    但是没有显示”we are in __main__“,也就是说模块__name__ = '__main__' 下面的函数没有执行。
    这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次。这才是关键。

    总结:
    1、如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
    2、这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!

  • 相关阅读:
    Spring MVC知识梳理
    Spring知识梳理
    combination sum(I, II, III, IV)
    两个面试题
    LeetCode高频148错题记录
    Multi label 多标签分类问题(Pytorch,TensorFlow,Caffe)
    Appearance-and-Relation Networks for Video Classification论文笔记 (ARTnet)
    LeetCode-450 二叉搜索树删除一个节点
    长短时记忆网络LSTM和条件随机场crf
    最大子数组(I, II, III,IV,V)和最大子数组乘积 (动态规划)
  • 原文地址:https://www.cnblogs.com/milantgh/p/3995530.html
Copyright © 2020-2023  润新知