背景:最近学习类的知识,有点好奇类中直接定义的属性与在初始化方法__init__中定义的属性有何区别?于是做了点试验:
直接在类中定义的属性,可以被类调用,也可以被实例调用:
>>> class rec():
a=3
>>> rec.a
3
>>> rec1=rec()
>>> rec1.a
3
那么在在初始化方法__init__中定义的属性呢?
>>> class rec():
a=3
def __init__(self,name):
self.name = name
>>> rec.name
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
rec.name
AttributeError: type object 'rec' has no attribute 'name'
>>> rec2= rec("jack")
>>> rec2.name
'jack'
上面的代码可以看出,__init__中定义的属性只可以被实例调用,不可以被类调用。
>>> class rec():
a=3
def __init__(self,name="NB"):
self.name = name
>>> rec3=rec()
>>> rec3.name
'NB'
>>> rec.name
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
rec.name
AttributeError: type object 'rec' has no attribute 'name'
即使在__init__中给name属性了一个默认值,通过类也不能调用。
结论:
- 类中直接定义的属性,相当于所有实例共有的属性。可以把类中通过的属性放到这里,比如定义一个圆形的类,可以把π的值直接定义到类中,相当于类的一个常量。
- init__中定义的属性只可以被实例调用。可以把需要初始化的属性放到这里,一般来说在__init 中定义属性更常用一些。