的事实是,在蟒蛇有类和实例之间有明显的区别属性:在类体内声明
属性,任何方法外,有类属性,它们是相同的该类的每个对象都是由子类继承的对象。请注意,做instance_obj.class_att = something
不会更改类属性的值,但只是创建实例属性并隐藏该对象的共享类属性。
实例属性是声明语法instance_obj.att = something
的那些,他们没有实例之间共享和最相似的事情,你在其他编程语言有非静态的属性,它们通常在创建init方法。 self
只是一个约定,用于指示自动传递给方法的实例对象。
下面是一个例子:
class MyClass:
c = 1 #class attribute, the subclasses will inherit this
def __init__(self):
self.i = 1 #instance attribute
MyClass.c #access attribute c of class MyClass
MyClass.i #error! MyClass has no attribute i
x = MyClass() #calling __init__ creates instance attribute i for obj x
x.i #access instance attribute i of object x
x.c #access class attribute c of class MyClass
x.c = 2 #hide MyClass.c and create instance attribute c for obj x
x.c #access instance attribute c of obj x
所以,总结一下,这样做的:
class y(x):
def __init__(self):
x.__init__(self)
是有用的,因为如果基类本来这样的事情
class x:
def __init__(self):
self.i=1
你不可能从任何y的实例访问属性i只是因为他们不会拥有它。
的基类可能会改变。 –