私有方法、私有属性
- 通过在类方法前面加上双下划线来将该方法私有化。属性的私有化同理。
- 私有方法不能在外面通过类的对象来直接访问,只能被类的其他方法调用。
- 主要用途在于能够将一些比较重要的函数隐藏起来,而通过间接的方式被外界访问到。
- 在继承过程中,私有方法和私有属性不能够被子类使用,但是有一种情况例外,也就是当所继承父类的公有方法当中使用了父类的私有方法和私有属性时。这也侧面说明了继承的本质不是复制父类公有的一切,而是使用父类公有的一切。
调用父类中被重写的方法
- 在子类中定义一个与父类名称相同的方法,就叫做方法的重写。子类的对象就会自动调用子类中的方法。但往往需要在重写父类方法时,再次调用父类的方法,此时的格式为:
superclassname.methodname(self)
super().methodname()
类属性与实例属性
- 由于在Python中一切皆对象,所以无论是类还是类的实例都是对象,类叫做类对象,而类的实例称为实例对象。
- 类对象中存储的属性称为类属性,而实例对象中存储的属性称为实例属性。
- 类属性在多个实例对象之间共享,而实例属性只属于某一个实例对象。
- 类属性在类中定义于方法的外面,定义时前面不加东西;而实例属性在类中定义于方法里面,在定义时要在前面加上self。
- 在类的外面通过实例对象访问类属性是可以的,但是不要用赋值语句通过实例对象修改类属性,因为这样做的效果就是向该实例添加一个实例属性。
类方法与实例方法
- 类方法的定义与实例方法有所不同,最大的区别就在于在定义时需要再类方法上面加上一句话,即@classmethod。
- 默认的参数与实例方法定义时的self相对应为cls(其实两者的名字都是可以随意取,只要保持形参在括号中与方法中一致即可,但默认情况下实例方法用self而类方法用cls),分别用来接收实例对象的引用和类对象的引用。
- 类方法只用于修改类属性;而实例方法既可以修改实例属性又可以修改类属性。
- 实例方法在外部调用时使用实例名称,而类方法的调用既可以使用类名称又可以实例名称。
- 需要注意的一点是,与实例属性不同,实例方法与类对象共同存储,所有实例对象公用一份。
方法内部的self和cls
- 前面讲到的实例方法和类方法在定义时,分别传入了参数为self和cls,它们分别表示实例对象的引用和类对象的引用。
- 在实例方法内部,通过self能够访问实例属性和其他的实例方法,当然也可以访问类属性和类方法。
- 在类方法内部,通过cls能够访问类属性和其他的类方法。
静态方法
- 静态方法也定义在类中,需要在前面机上一句话,即@staticmethod,且与前两种方法都不同的是它不需要默认参数。
- 静态方法与类方法一样,都是既可以用类名也可以用实例名来调用。
- 类方法用来修改类对象中存储的属性,实例方法用来修改实例对象中存储的属性;若要写的方法既不对类属性进行修改,也不对实例属性进行修改,该方法就写为静态方法。