学习Python的过程中,__init__ 的用法是一个难点,即使许多Python的书籍上,关于Python __init__ 用法也是写得十分拗口、难懂,今天终于找到一个关于Python __init__ 用法说明,我觉得说得很透彻,分享给大家。
一、不用__init__方法也是可以的。
比如,定义一个矩形的类,目的是求周长和面积。
class Rectangle(): def getPeri(self,a,b): return (a + b)*2 def getArea(self,a,b): return a*b rect = Rectangle() print(rect.getPeri(3,4)) print(rect.getArea(3,4)) print(rect.__dict__)
得到结果:
14 12 {}
但是,我们通过print(rect.dict)来看这个实例的属性,竟然是空的,我定义了一个矩形,按理来说它的属性应该是它的长、宽。但是它竟然没有。这就是没有定义init()的原因了。
并且,在实例化对象的时候,rect = Rectangle()参数为空,没有指定a、b的值,只有在调用函数的时候才指定了。且类中定义的每个方法的参数都有a、b,这显然浪费感情,在类中直接指定方法就可以了。
因此需要在类中定义init()方法,方便创建实例的时候,需要给实例绑定上属性,也方便类中的方法(函数)的定义。
二、用__init__方法定义类
class Rectangle(): def __init__(self,a,b): self.a = a self.b = b def getPeri(self): return (self.a + self.b)*2 def getArea(self): return self.a * self.b rect = Rectangle(3,4) print(rect.getPeri()) print(rect.getArea()) print(rect.__dict__)
得到结果:
14 12 {'a': 3, 'b': 4}
定义完__init__后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。
以下是以前自己写的版本:
__init__ 的意思是:initialize,初始化,因此可以理解实例化出某个类的对象时调用的初始化方法。
1、它位于类内部,可以让你在里面先做一些初始化工作,例如定义一些变量供后面的其它方法使用。
class Song(): def __init__(self,lyrics): self.lyric = lyrics def sing_me_a_song(self): for line in self.lyric: print line happy_baby = Song(['happy birthday to you', 'I do not want to get sued', 'So i will stop right there']) bulls_on_parade = Song(['They rally around the family', 'with pockets full of shells']) happy_baby.sing_me_a_song() bulls_on_parade.sing_me_a_song()
2、定义类的时候,若是添加__init__方法,那么在创建类的实例的时候,实例会自动调用这个方法,一般用来对实例的属性进行初使化。比如:
只要其所在的类被实例化了,这个(特殊)方法就会被执行。 相对的,我们都知道,类里面的方法,如果没有被调用到,它是不会被执行到的,而这个(特殊)方法却不需要明确调用即可被执行。
三、文件夹中的__init__.py
比如,我们的foo/文件夹下面有许多的文件fooFactory.py, shortfoos.py, tallFoos.py,
通过在__init__.py中写代码,
__all__ = ['foofactories', 'tallFoos', 'shortfoos', 'medumfoos', 'santaslittlehelperfoo', 'superawsomefoo', 'anotherfoo'] # deprecated to keep older scripts who import this from breaking from foo.foofactories import fooFactory from foo.tallfoos import tallFoo from foo.shortfoos import shortFoo
则可以在别的脚本里简单方便的写:
from foo import fooFactory, tallFoo, shortFoo
简化了在其他地方的导入。
https://blog.csdn.net/djangor/article/details/39673659