一: 继承性
# 继承指的是类与类之间的关系
# 继承是创建新类的方法,Python中,
# 新的类可以继承一个或多个父类,父类有可以成为基类或者超类
# 新建的类称为派生类或子类
# 继承的方式可以分为单继承或者多继承
class Father:
pass
class Mother:
pass
class Child(Father, Mother):
pass
print(Child.__bases__)
# 继承的优先顺序: 新式类:广度优先 》 经典类:深度优先
# 派生:在子类中定义新的东西
# 经典类:Python2 没有继承object的类及子类都是经典类
# 新式类:Python3 全部都是新式类
# 继承实验
class A:
def __init__(self):
print('A')
class B(A):
def __init__(self):
super(B,self).__init__()
print('B')
pass
class C(A):
def __init__(self):
super(C, self).__init__()
print('C')
class D(B):
def __init__(self):
super(D, self).__init__()
print('D')
pass
class E(C):
def __init__(self):
super(E, self).__init__()
print('E')
class F(D,E):
def __init__(self):
super(F, self).__init__()
print('F')
pass
foo = F()
print(F.mro())
二: 多态性
# 多态性:可以在不考对象类型的情况下直接使用对象
# 如:len(str) len(int) print() 等,不许考虑类型直接使用(相对于C而言)
# 多态性的优点:1.增加程序的灵活性 2.增加了程序的扩展性
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def run(self):
pass
# 动态多态性:
class Pig(Animal):
def run(self):
pass
class Dog(Animal):
def run(self):
pass
pig = Pig()
dog = Dog()
pig.run()
dog.run()
# 静态多态性
# str、int、list 都支持 ‘+’ 且不用考虑类型
三:封装性
# 隐藏属性: 2个‘_’开头
# 特点:1.外部无法直接访问
# 2.类的内部可直接访问
# 3.子类无法覆盖父类的隐藏属性
# 注意:1.此变形并没有真正的隐藏属性
# 2.变形只发生在类定义的过程中,定义后的赋值操作不会有效果
# 3.在继承中父类如果不想子类覆盖自己方法,可以定义为私有
class A:
__x = 1 #变形成_A__x
def foo(self):
print(self.__x) #也自动变形成_print(self._A__x)
# 封装的意义:并非是单纯的隐藏属性
# 1.封装数据属性:明确地区分内外部变量,控制外部对隐藏属性的行为
# 2.隔离复杂度
# 封装的扩展性:使用类的方法的人不需要考虑方法的实现过程,
# 开发者可以按需求修改方法的实现而不用考虑使用者