封装

类中把某些属性和方法隐藏起来,或者定义为私有,只在类的内部使用,在类的外部无法访问,或者留下少量的接口(函数)供外部访问;从上一篇文章中的私有属性与私有方法中的代码体现了该特性。

class man():
def __init__(self,name):
self.name = name
self.__passwd = "123456" def changepass(self,newpasswd):
self.__passwd = newpasswd
print(self.__passwd) liming = man("liming")
#没有liming.passwd/liming.__passwd属性
#只能通过一下changepass方法来查看或修改内部属性
liming.changepass("abc123456")

  

继承

一个种类里面,存在共有的属性和动作。比如动物类,存在共有的属性(长度、高度等)和动作(吃、跑、叫等)。在程序中是为了实现代码的重用,相同的代码不需要重复的编写。父类里定义的属性、方法自动被子类继承。

比如下面的这个例子(仅继承):

class dog:
def __init__(self,name):
self.name = name def eat(self):
print("%s,正在吃..."% self.name) def run(self):
print("%s,正在跑..."% self.name) class poodle(dog): #poodle(贵宾犬)是dog的子类.poodle类继承了dog类的所有属性与方法。
pass my_dog = poodle("小花")
my_dog.eat()
my_dog.run()
#输出
小花,正在吃...
小花,正在跑...

  

当然,子类不仅可以继承父类,还可以在父类的基础上增加其他方法和属性。

class dog:
def __init__(self,name):
self.name = name def eat(self):
print("%s,正在吃..."% self.name) def run(self):
print("%s,正在跑..."% self.name) class poodle(dog):
def lovely(self): #增加新的方法
print("%s is lovely!" % self.name) my_dog = poodle("小花")
my_dog.eat()
my_dog.run()
my_dog.lovely()
#输出
小花,正在吃...
小花,正在跑...
小花 is lovely!

  

重构父类方法(重写)

重写父类方法:

class dog:
def __init__(self,name):
self.name = name def eat(self):
print("%s,正在吃..."% self.name) def run(self):
print("%s,正在跑..."% self.name) class poodle(dog):
def run(self):
print("%s is running!" % self.name) my_dog = poodle("小花")
my_dog.eat()
my_dog.run() #输出
小花,正在吃...
小花 is running!

  

 

先执行父类方法中的代码再执行子类方法中的代码:

class dog:
def __init__(self,name):
self.name = name def eat(self):
print("%s,正在吃..."% self.name) def run(self):
print("%s,正在跑..."% self.name) class poodle(dog):
def run(self):
dog.run(self)
print("%s is running!" % self.name) my_dog = poodle("小花")
my_dog.eat()
my_dog.run() #输出
小花,正在吃...
小花,正在跑...
小花 is running!

  

完全重构构造函数:

class dog:
def __init__(self,name):
self.name = name def eat(self):
print("%s,正在吃..."% self.name) def run(self):
print("%s,正在跑..."% self.name) class poodle(dog):
def lovely(self):
print("%s is lovely!" % self.name) class jiwawa(dog):
def __init__(self,name,gun):
dog.__init__(self,name)
self.gun = gun
def wawa(self):
print("%s 是吉娃娃狗种!" % self.name)
def xgun(self):
print("%s" % self.gun) dog1 = poodle("小花")
dog1.eat()
dog1.run() dog2 = jiwawa("小黑","yes")
dog2.wawa()
dog2.xgun() ##输出
小花,正在吃...
小花,正在跑...
小黑 是吉娃娃狗种!
yes

 

也可以使用这种写法

super(jiwawa,self).__init__(name)

  

新式类与经典类

经典类是老版本,新式类是新版版。

#经典类
class dog: #新式类
class dog(object):

  

#经典类写法
dog.__init__(self,name)
#新式类写法
uper(jiwawa,self).__init__(name)

  

经典类与新式类的区别:多继承。

多继承

class dog:
def __init__(self,name):
self.name = name def eat(self):
print("%s,正在吃..."% self.name) def run(self):
print("%s,正在跑..."% self.name) class Relation(object):
def makefriends(self,obj):
print("%s要和%s交朋友!" % (self.name,obj.name)) class poodle(dog,Relation):
def lovely(self):
print("%s is lovely!" % self.name) class jiwawa(dog):
def __init__(self,name,gun):
#dog.__init__(self,name)
super(jiwawa,self).__init__(name)
self.gun = gun
def wawa(self):
print("%s 是吉娃娃狗种!" % self.name)
def xgun(self):
print("%s" % self.gun) dog2 = jiwawa("小黑","yes")
dog1 = poodle("小花") dog1.makefriends(dog2) #输出
小花要和小黑交朋友!

  

多态

  • 多态不同的子类对象调用相同的父类方法,产生不同的执行结果
  • 多态可以增加代码的灵活度,以继承和重写父类方法为前提是调用方法的技巧,不会影响到类的内部设计
  • 同一个接口多种实现
class dog:
@staticmethod
def dog_run(obj):
obj.run() class poodle(dog):
def run(self):
print("贵宾犬,正在跑!") class jiwawa(dog):
def run(self):
print("吉娃娃,正在跑") d1 = poodle()
d2 = jiwawa()
dog.dog_run(d1)
dog.dog_run(d2)

  

Python面向对象三大特性(封装、继承、多态)的更多相关文章

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

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  2. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  3. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  4. C++三大特性 封装 继承 多态

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

  5. python面向对象三大特性之一继承、多态、封装

    继承,即在定义一个类时,以另一个类为参数,则称这个新定义的类继承了参数类,父类又称为基类. 单继承表示只继承一个类,多继承表示继承多个类. class parent1: pass class pare ...

  6. Python()- 面向对象三大特性----封装

    封装: [封装]         隐藏对象的属性和实现细节,仅对外提供公共访问方式.[好处] 1. 将变化隔离: 2. 便于使用:3. 提高复用性: 4. 提高安全性:[封装原则]      1. 将 ...

  7. python面向对象三大特性之继承

    继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...

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

    [.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...

  9. python面向对象-三大特性

    python面向对象编程三大特性 小结:前面我们说完了类和对象的关系,相信对类和对象的理解更加透彻..让我们一起去研究面向对象的三大特性吧.... 继承 1.什么继承? 在程序中继承就是事物之间的所属 ...

随机推荐

  1. python xlrd操作

    python里面的xlrd模块详解(一)   那我就一下面积个问题对xlrd模块进行学习一下: 1.什么是xlrd模块? 2.为什么使用xlrd模块? 3.怎样使用xlrd模块? 1.什么是xlrd模 ...

  2. 开源堡垒机jumpserver的安装

    开源跳板机jumpserver安装 简介 Jumpserver 是全球首款完全开源的堡垒机, 使用GNU GPL v2.0 开源协议, 是符合4A 的专业运维审计系统 Jumpserver 使用Pyt ...

  3. [Redis-CentOS7]Redis列表操作(三)

    LPUSH添加列表 127.0.0.1:6379> LPUSH websites www.baidu.com (integer) 1 LRANGE 获取全部值 127.0.0.1:6379> ...

  4. C++ 解决列车重排问题

    问题节选自<<数据结构.算法与应用(C++语言描述)>>, 思路与代码为原创, 如有疏漏及问题欢迎指正 问题描述: 一辆列车有n节车厢, 车厢排列乱序(如: 284657139 ...

  5. Github上优秀的.NET Core项目

    Github上优秀的.NET Core开源项目的集合.内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志.代码分析.教程等. Github地址:htt ...

  6. C#_Excel数据读取与写入_自定义解析封装类_支持设置标题行位置&使用excel表达式收集数据&单元格映射&标题映射&模板文件的参数数据替换

    本篇博客园是被任务所逼,而已有的使用nopi技术的文档技术经验又不支持我需要的应对各种复杂需求的苛刻要求,只能自己造轮子封装了,由于需要应对很多总类型的数据采集需求,因此有了本篇博客的代码封装,下面一 ...

  7. css选择器四大类:基本、组合、属性、伪类

    什么是选择器?选择器的作用是通过它可以找到元素,把css样式传递给元素!css选择器主要分为:基本选择器.属性选择器.组合选择器与伪类选择器四个大类! css基本选择器 基本选择器又分为:*通配符.标 ...

  8. linux下安装lxml包

    爬虫项目需要用到lxml包,解析html文件,但是linux服务器没有lxml包, 服务器中python版本是3.8. 直接使用命令安装: pip install lxml 中途会报错,错误提示我没有 ...

  9. 【48】数据扩充(Data augmentation)

    数据扩充(Data augmentation) 大部分的计算机视觉任务使用很多的数据,所以数据扩充是经常使用的一种技巧来提高计算机视觉系统的表现.我认为计算机视觉是一个相当复杂的工作,你需要输入图像的 ...

  10. P5443 [APIO2019]桥梁 [分块+并查集]

    分块+并查集,大板子,没了. 并查集不路径压缩,可撤销,然后暴力删除 这样对于每个块都是独立的,所以直接搞就行了. 然后块内修改操作搞掉,就是单独的了 // powered by c++11 // b ...