面向对象的三大特征即继承、封装、多态
1.继承
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
优点
- 提高了代码的复用性
- 提高了代码的维护性
- 在类与之间产生了关系,是多态的前提
抽象与重用性
- 继承与抽象:抽象即将类相似的部分提取出来, 形成一种统一。
继承是基于抽象的结果,当面向对象编程的过程中要对类进行抽象, 将抽象的结果形成一个基类, 让其他类去继承这个基类, 使得其他类拥有基类的属性与方法, 减少重复代码的编写与维护. - 继承与重用性:继承的目的有两方面:
一方面: 提高代码的重用性, 减少冗余代码
另一方面: 实现接口类, 规范子类, 实现归一化
继承的实现
1.子类继承父类
class ClsA(object):
nest = 'A类'
def func(self):
pass
# 子类ClsB继承与ClsA
# ClsA称为父类(或基类), ClsB称为子类(或派生类)
class ClsB(ClsA):
pass
2. 子类调用父类的方法
class ClsA(object):
nest = 'A类'
def func(self):
print("A类")
class ClsB(ClsA):
pass
b_obj = ClsB()
b_obj.func()
子类ClsB调用父类ClsA中的方法
3.子类重写父类方法
class ClsA(object):
nest = 'A类'
def func(self):
print("A类")
class ClsB(ClsA):
# 定义与父类同名的方法
def func(self):
print(111)
b_obj = ClsB()
b_obj.func()
4.多继承的实现
多继承: 一个类继承多个类时就产生了多继承
class A(object):
pass
class B(object):
pass
# C类继承了A类与B类, 此为多继承
class C(A, B):
pass
5.mro顺序
mro顺序是指一个类产生多继承时, 调用一个方法或属性时在其所有父类中的搜索顺序, 可以通过`类名.__mro__`获取其搜索顺序
2.封装
将描述事物的数据和操作封装在一起,形成一个类;被封装的数据和操作只有通过提供的公共方法才能被外界访问,私有属性和方法是无法被访问的,增加数据的安全性。
封装的优势
- 减少代码冗余
- 将变化隔离
- 便于使用
- 提高复用性
- 提高安全性
私有属性与私有方法
1. 私有属性在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)
class A(object):
__n = 123
def func(self):
pass
a = A()
print(a.__n) # 由于__n是A类的私有方法, 所以对象不能直接获取该属性
print(a._A__n) # 此种方式可以获取A类的私有属性
2. 私有方法: 在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的
# 将fa定义成私有方法,即__func
class A:
def __func(self): # 在定义时就变形为_A__func
print('from A')
def test(self):
self.__func() # 只会与自己所在的类为准,即调用_A__func
property, classmethod, staticmethod属性
1.property
property属性: property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值property属性有两种方法: @property装饰器 和 property()函数
@property装饰器: @property装饰器就是负责把一个方法变成属性调用的
# @property装饰器将score方法变成属性,可以通过s.score来获得
@property
def score(self):
print("getting score")
return self._score
s = Student(60)
s.score
2. classmethod
classmethod修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等
class A(object):
bar = 1
def func1(self):
print ('foo')
@classmethod
def func2(cls):
print ('func2')
print (cls.bar)
cls().func1() # 调用 foo 方法
A.func2() # 不需要实例化
3.staticmethod
staticmethod返回函数的静态方法,staticmethod声明的静态方法,可以实例化调用静态方法,也可以不实例化调用该静态方法
语法:staticmethod(function)
class C(object):
@staticmethod
def func():
print('runoob')
C.func() # 静态方法无需实例化
cobj = C()
cobj.func() # 也可以实例化后调用
3.多态
多态就是一个对象变量可以指向多种实际类型的现象,同一个事件发生在不同的对象上会产生不同的结果。
优点:1.提高了代码的维护性 2.提高了程序的扩展性
缺点:不能访问子类特有功能
运行时的三个条件
1.继承 2.覆盖(重写) 3.向上转型