封装
封装是使用特殊的语法,对成员属性和成员方法进行包装,达到保护和隐藏的目的,但不能把成员全部封装死,就失去了意义。被封装的成员主要是供类的内部使用,被特殊语法封装的成员会有不同的访问的权限。
- 封装的实现
公有的封装:
默认定义的成员都属于公有成员,公有成员可以在任何位置进行访问和操作;
受保护的封装:
在成员名称前面加一个下划线_成员名称(Python没有具体实现,是约定俗成的),受保护的成员和公有成员一样可以在任何位置进行访问,但是一般不要随便访问和操作受保护成员;
私有的封装:
在成员名称前面加两个下划线__成员名称,私有的成员只能在当前类的内部去操作和访问,不能在类的外部进行操作。
说明:在Python中并没有受保护的封装,属于开发者的约定俗成,私有化封装是通过改名策略实现的,并不是真正的私有化。
继承
在已有类的基础上创建新类,让一个类从另一个类中将属性和方法继承下来,提高代码的重用性,建立新的类与类的关系,方便其他逻辑的操作。提供继承信息的称之为父类,也称为超类或基类;得到继承信息的称之为子类,也称为派生类或衍生类。子类除了继承父类提供的属性和方法,还可以定义自己特有的属性和方法,所以子类比父类拥有更多的能力。
多态
子类在继承父类的方法后,可以对父类已有的方法给出新的实现版本,这个动作称之为方法重写(override)。通过方法重写可以让父类的同一行为在子类中拥有不同的实现版本,当调用这个经过子类重写的方法时,不同的子类对象会表现出不同的行为,这就是多态。
from abc import ABCMeta, abstractmethod
class Pet(object, metaclass=ABCMeta):
"""宠物"""
def __init__(self, nickname):
self._nickname = nickname
@abstractmethod
def make_voice(self):
"""发出声音"""
pass
class Dog(Pet):
"""狗"""
def make_voice(self):
print('%s: 汪汪汪...' % self._nickname)
class Cat(Pet):
"""猫"""
def make_voice(self):
print('%s: 喵...喵...' % self._nickname)
def main():
pets = [Dog('旺财'), Cat('凯蒂'), Dog('大黄')]
for pet in pets:
pet.make_voice()
if __name__ == '__main__':
main()
说明:‘Pet’类是一个抽象类,抽象类就是不能创建对象的类,这种类的存在就是专门为了让其他类来继承它。Python从语法层面并没有像Java或C#那样提供对抽象类的支持,但是我们可以通过'abc'模块的‘ABCMeta’元类和‘abstractmethod’包装器来达到抽象类的效果,如果一个类中存在抽象方法,那么这个类不能够实例化(创建对象)。