oop编程中的封装、继承、多态的三大特性
1、封装
#封装分为广义上的封装和狭义上的封装
广义上的封装---函数的封装(减少代码的重复性,提高代码的复用性)
狭义上的封装---面向对象语言对对象特征的封装
----------------------------------------------------------------------
狭义上的封装:
将无需对外暴露的内容隐藏起来[私有化]然后提供对应的设置和获取的接口[是用方法体现的] 设置 -- 英文 -- set方法
获取 -- 英文 -- get方法
-----------------------------------------------------------------------
面向对象语言中封装的体现:
将对象的属性私有化 不让外界随意修改 然后根据需求提供对应的set和get方法供外界获取属性值 和
修改属性值。
-----------------------------------------------------------------------
如何将对象的属性私有化
在特征属性名前添加两个下划线
self.name
self.__name
------------------------------------------------------------------------
好处:
1. 可以在设置值的时候根据生活实际需求添加对应的逻辑判断
2. 保护了隐私 不允许外界随意修改赋值
3. 降低了代码的重复率
2、继承
从父辈获取父辈拥有的东西
在程序中的继承:
从两个或者两个以上的相关的普通类中提取共同的特征和行为到一个共通类中, 再使用继承的体系,普通
类从对应的共通类中获取被提取的特征和行为
共通类:
称之为父类, 超类 基类
普通类:
称之为子类
------------------------------------------------------------
父类的声明格式
class 父类类名:
def __init__(self, 从众多子类中提取出来的特征):
pass
众多子类中的共同行为
子类的声明格式
class 子类类名(父类类名, 父类1, 父类2,.., 父类n):
def __init__(self, 被提取的共同特征, 自己特有的特征):
pass
------------------------------------------------------------
【例:】
#人类
class Person:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
#共同的行为:
def eat(self):
print(self.name, "在吃饭")
#工人类
class Worker(Person):
def __init__(self, name, age, sex, wage):
#super(Worker, self).__init__(name, age, sex)
#super().__init__(name, age, sex)
Person.__init__(self, name, age, sex)
self.wage = wage
#独特的行为
def work(self):
'''
子类使用父类中的未私有化的信息 就像使用自己的一样
'''
print(self.name, "在工作")
3、多态
1、多态
1、多态:
事物的多种形态 ----> 一类事物有多种形态
变量的多种形态 ‐‐‐‐> 是根据赋值情况产生的多种形态 ‐‐‐‐> 查看 变量的数据类型根据赋予对应的数据值来决定的
-------------------------------------------------
多态指的是一类事物有多种形态,比如
动物有多种形态:人,狗,猪
他们实例化出来的对象调用同一种方法时会有不同的表现形式
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
@abc.abstractmethod
def talk(self):
pass
class People(Animal): #动物的形态之一:人
def talk(self):
print('say hello')
class Dog(Animal): #动物的形态之二:狗
def talk(self):
print('say wangwang')
class Pig(Animal): #动物的形态之三:猪
def talk(self):
print('say aoao')
---------------------------------------------------
2、多态性
1、什么是多态动态绑定(在继承的背景下使用时,有时也称为多态性)
多态性是指在不考虑实例类型的情况下使用实例,多态性分为静态多态性和动态多态性
静态多态性:如任何类型都可以用运算符+进行运算
动态多态性:如下
peo=People()
dog=Dog()
pig=Pig()
#peo、dog、pig都是动物,只要是动物肯定有talk方法
#于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
peo.talk()
dog.talk()
pig.talk()
#更进一步,我们可以定义一个统一的接口来使用
def func(obj):
obj.talk()
-----------------------------------------------------------
2、为什么要用多态性(多态性的好处)
其实大家从上面多态性的例子可以看出,我们并没有增加什么新的知识,也就是说python本身就是支持多态性的,这么做的好处是什么呢?
1、增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
2、增加了程序额可扩展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用
>>> class Cat(Animal): #属于动物的另外一种形态:猫
... def talk(self):
... print('say miao')
...
>>> def func(animal): #对于使用者来说,自己的代码根本无需改动
... animal.talk()
...
>>> cat1=Cat() #实例出一只猫
>>> func(cat1) #甚至连调用方式也无需改变,就能调用猫的talk功能
say miao
'''
这样我们新增了一个形态Cat,由Cat类产生的实例cat1,使用者可以在完全不需要修改自己代码的情况下。使用和人、狗、猪一样的方式调用cat1的talk方法,即func(cat1)
'''