python_面向对象之多态、封装

多态
一.定义
多态:有不同的类实例化得到的对象,调用不同的方法,执行的逻辑不同。
类的继承有两层意义:1.改变,2.扩展。多态就是类的两层意义的一个具体的实现机制,即:调用不同的类实例化的对象下的相同方法,实现的过程不一样。
一.封装
封装可以理解为一个多功能的自助饮料机器,且机器是不透明密封的,只在下方开了不同的龙头,当顾客需要不同的饮料时,只需要去打开不同的龙头开关即可得到自己想要的饮料,但顾客不知道机器内部是产生不同的饮料的。
在python中,封装可以是类,可以是函数。封装是将数据或属性隐藏在内部,不让外部看到。
二.封装的使用
类的封装两个层面,第一个层面的封装:类就是一个容器,这本身就是一种封装;第二个层面的封装:类中定义私有的属性,只在类的内部使用,外部无法访问。
Python中不依赖语言特征去实现第二个层面的封装,而是通过遵守一定的数据属性和函数属性的命名约定来达到封装的效果。
约定1.任何以双下划线开头的名字都应该是类内部私有的属性,外部无法访问。如下图:

这是调用类私有的数据属性,如果调用类私有的函数属性呢?结果见下图:

从上面的例子,我们可以发现:类中双下划线命名的所有属性(包含:数据属性和函数属性)在外部均不能正常访问。
那么外部是不是真的就不能访问内部的数据属性呢?我们先打印类的属性字典,此时会发现类中的以双下划线开头的leadteacher数据属性和activy均发生了改变,如下图所示:

至此我们发现:此时在对应的双下划线的属性下面加上了_类名,那么是不是就有办法在外部来进行访问了呢?如下图:

总结:以单下划线或双下划线命名的属性,只是一种约定,并不是说python一定不能访问。实际上,python并不会真的阻止你访问私有的属性,模块也是这种约定。

那么,子类继承父类后,子类是否可以访问父类私有的属性呢?见下图:

封装的第三个层面:明确区分内外,内部的实现逻辑,外部无法知晓,并且为封装到内部的逻辑他提供一个访问接口给外部使用(这才是真正的封装),封装的含义就是将类内部的属性隐藏起来,但是外部如果要使用它怎么办?这是就用到了第三个层面的封装了,我们可以在类的类别定义一个函数调用双下划线的属性,这样我们通过调用这个函数就可以间接的访问类中隐藏的属性了。改写上面的例子,见下图:

该部分的代码块为:

class School():
    price = 12000
    __leadteacher = "刘昌明"   #双下划线开头的数据属性
    def __init__(self,name,addr,type):
        self.name = name
        self.addr = addr
        self.type = type

    def showinfo(self):
        print("%s位于%s,是一所%大学,学费是%s"%(self.name,self.addr,self.type,self.price))

    def __activy(self):
        print("学校正在举办书法比赛")

    def returninfo(self):           #通过类中的函数来访问隐藏的属性,以供外部调用,这才是真正意义上的封装
        print("这个学校的现在是%s"%self.__leadteacher)
        self.__activy()

# class Student(School):
#     print(School.__leadteacher)
s1 =School("长江大学","湖北省荆州市","国立一本")

#直接在外部访问类的数据属性
# print(s1.price)
# print(s1.__leadteacher)   #报错
# print(s1._leadteacher)   #报错
#直接在外部访问类的函数属性
# s1.__activy()     #报错
#打印类的属性字典
# print(School.__dict__)
#再次访问类的内部属性
# print(s1._School__leadteacher)
# s1._School__activy()
# student = Student()
#通过类中的接口函数来访问类中隐藏的属性
s1.returninfo()

原文地址:http://blog.51cto.com/10836356/2109167

时间: 2024-10-29 02:50:53

python_面向对象之多态、封装的相关文章

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

c++面向对象三大特征封装、继承和多态知识总结

面向对象三大特征:封装,继承,多态: 一.封装:该公开的就公开话,该私有的就隐藏掉,主要是由public,private实现:作用是便于分工和分模块,防止不必要的扩展: 二.继承:就是一种传承,可以把父类型中的数据传承到子类中,子类除了传承了父类的数据之外,还可以对父类型进行扩展: 公开继承  public 保护继承  protected 私有继承  private 保护成员:在子类和本类中可以访问,其他不行: 1.公开继承:在公开继承下,父类型中的数据是公开的到子类型中权限是公开的:父类型中保

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)

Mysql数据库大量删除操作及谈面向对象中的封装继承和多态原理(图)最近进行数据库操作,遇到一个问题,就是大量删除一个数据表中的数据后,由于设定了id是自增的,导致再插入时,默认生成的id会很大,这个时候想要再次插入新的数据,应该怎么办呢?1.明确目前最后一个id的大小select id from tags order by id DESC limit 0,1; 假设返回的是9,则设置数据表从10开始自增 2.修改这个数据表从10开始自增alter table tags auto_increme

类与对象 面向对象和面向过程对比 面向对象三大特征:封装 继承 多态

 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大象, 第三步, 关门 面向对象:大象, 你进冰箱. 此时主语是大象. 我操纵的是大象. 此时的大象就是对象 1. 面向过程: 一切以事物的流程为核心. 核心是"过程"二字, 过程是指解决问题的步骤, 即, 先?干什么, 后干什么. 基于该思想编写程序就好比在编写一套流水线. 是一种机械 式的编程

13.面向对象(多态/(性)/封装)

多态封装特性strstaticmethod解除绑定方法classmethod小结: 多态 同一种事物的多种形态 增加了程序的灵活性 增加了程序的可扩展性 封装 封装数据:保护隐私 封装方法:隔离复杂度 第一种封装: 什么都不做 第二种封装: 双下划线的隐藏属性 语法糖:__xxx====>_类__xxx #这个过程就是变形 特性 @property #xxx = property(xxx) def xxx(): pass class Squera: #定义一个正方形的类 def __init__

python面向对象之继承/多态/封装

老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(self,name,speed,load,power): self.name = name self.speed = speed self.load = load self.power = power def run(self): print("开动啦.") class Benz(Vehicle

Java面向对象的多态

Java中多态的概念是面向对象中除封装和继承外非常重要的知识点,也是Java面向对象三大特性最后一个特性 多态其实就是指对象存在的多种形态,多态分为引用多态和方法多态 引用多态的含义就是:父类的引用可以指向它本类的对象,不仅如此父类的引用还可以指向子类的对象,这就是引用多态 用简单的代码来看一下引用多态的含义: 动物类:Animal 1 public class Animal { 2 public Animal(){ 3 System.out.println("Animal类的构造方法被执行&q

[.net 面向对象编程基础] (11) 面向对象三大特性——封装

[.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承.多态. 1.封装概念 封装:每个对象都包含有它能进行操作的所有信息,这个特性称为封装.这样的方法包含在类中,通过类的实例来实现. 2.封装的优点 A.良好的封装能够减少耦合(比如实现界面和逻辑分离) B.可以让类对外接口不变,内部可以实现自由的修改 C.类具有清晰的对外接口,使用者只需调用,无需关心

Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇

一.面向对象之多态 1.多态:简而言子就是多种形态或多种类型 python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型, java多态传参:必须是传参数的数据类型或传参的子类类型 面向对象总结: 面向对象是一种编程方式,此编程方式的实现是基于类和对象的使用 类:是一个模板,模板中包含了多个函数共使用,即类中可包含多个函数(类中的函数即叫做方法) 一般疑问: 1)什么样的代码才是面向对象? 简单来说,如果程序中的所有功能否是由 “类”和“对象”实现,那么就是面向对