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