Python03 对象的多态,封装与继承

1. 面向对象的编程核心概念

面向对象的编程(OOP:Object Oriented Programing)是一种编程的思想,把每一个对象为程序的基本单元,并且,每一个对象内含有相应的数据,和处理数据的函数。

2. 面向对象的特性

  • 多态性(polymorphism):对不同对象使用同样的操作(调用同样名字的不同方法)。
  • 封装性(encapsulation):把对象当成一个整体来看待,对对象外部隐藏内部细节
  • 继承性(inheritance) :对象是可以派生和继承的。就好比交通工具(vehicle)可以派汽车(car)和公交车(bus)。汽车和公交车是独立存在的不同对象,但都继承了交通工具的所有属性。其中vehicle类为继承基类,car类和bus类为派生类。

3. 例题题目

定义三个对象:

人:2个属性(名字,年龄)

  定义__str__()方法,返回格式:Name:   Age:  。
  人继承俩个对象(学生,和教授)

学生:

  继承人(Person类)的名字和年龄。
  设置私有属性且外部可以访问:成绩(score)
  设置方法myInfo() 打印如"我是学生,我23岁,我的名字是劫,我的成绩89分。"
  

教授:

  继承人 (Person类)的名字和年龄。
  设置私有属性且外部可以访问:学科(subject)
  设置方法myInfo() 打印如"我是教授,我59岁,我的名字是安妮,我的学科是生物。"

分别实例化对象成三个实例
人名字叫Lee,24岁。
学生名字叫Zed,23岁,89分。
教授名字叫Annie,59岁,生物专业。

explanation

4. 程序源码

class Person(object):     #对象的封装性:Person本身拥有这些数据,要访问这些数据就没必要从外面的函数访问,可以直接在Person类内部定义访问的函数,这样就把“数据”封装起来
    def __init__ (self,name,age):
        self.name=name
        self.age=age

    def __str__(self):
        return 'Name:%s Age:%s'%(self.name,self.age)

class Student(Person):                  #Student类是从Person类继承而来
    def __init__ (self,name,age,score):
        self.__score=score        # __  <----这个代表着属性私有化,外部无法访问
        super().__init__(name,age)
    def get_score(self):          #利用getter 访问私有属性
        return self.__score

    def myInfo(self):
        print('I am a student. I am %s years old. My name is %s and my grade is %s.'%(self.age,self.name,self.__score))


class Professor(Person):     
    def __init__(self,name,age,subject):
        self.__subject=subject
        super().__init__(name,age)
        
    def get_subject(self):
        return self.__subject

    def myInfo(self):
        print('I am a professor. I am %s years old. My name is %s and I teach %s.'%(self.age,self.name,self.__subject))


Lee=Person('lee',24)     #对象实例化
print(Lee)               #定义了__str__方法之后,会按照定义,打印出该对象的姓名和年龄。(具体可查看第七行)

Zed=Student('Zed',23,89)
print('Score:    %s'%Zed.get_score())
Zed.myInfo()

Annie=Professor('Annie',59,'BIO')
print('Subject:  %s'%Annie.get_subject())
Annie.myInfo()          #myInfo()现了面对对象编程的多态性

5. 程序运行截图

python Object result

6. 后记

  • 对象内的函数称之为“方法“
  • 子类是不能访问父类的私有属性。
  • 若父类方法的功能不能满足你的需求,可在子类重写你父类的方法。