Python面向对象程序设计类的封装与继承用法示例


Posted in Python onApril 12, 2019

本文实例讲述了Python面向对象程序设计类的封装与继承用法。分享给大家供大家参考,具体如下:

访问限制(封装)

1、概念

面向对象语言的三大特征:封装, 继承, 多态。

广义的封装: 类和函数的定义本身就是封装的体现。

狭义的封装:一个类的某些属性,不希望外界直接访问,而是把这个属性私有化[只有当前类持有],然后暴露给外界一个访问的方法。

封装的本质:就是属性私有化的过程。

封装的好处:提供了数据的复用性,保证了数据的安全性。

举例:插排

2、使用

class Person(object):
 def __init__(self, name, age, height, weight, money):
  self.name = name
  self.__age__ = age
  self.weight = weight
  self.__money = money
  self.__height = height
 def run(self):
  print(self.__money)
 def eat(self):
  print("eat")
 # 通过内部方法,去修改、获取私有属性
 # 通过自定义的方法实现对私有属性的赋值与取值
 # set方法:setxxx
 def setMoney(self, money):
  # 数据的过滤
  if money < 0:
   money = 0
  self.__money = money
 # get方法:getXXX
 def getMoney(self):
  return self.__money
per = Person("hanmeimei", 20, 170, 55, 10000)
# 1.属性被私有化之后的访问
# 如果要让内部属性不被外部直接访问,在属性前加两个下划线(__),
# 在python中如果在属性前面加两个下划线,name这个属性就变成了私有属性[private]
# 私有属性的含义:在外界不能像以前那么直接访问
# print(per.__money) #无法在外界直接访问
per.run() # 内部可以访问
# 2.解决办法: 如何对私有属性取值和赋值
# 属性被私有化之后,可以通过get/set的方法进行访问
per.setMoney(10)
print(per.getMoney())
# 3.工作原理
# 不能直接访问per.__money是因为python解释器把__money变成了_Person__money
# 仍然可以使用_Person__money去访问,但是强烈不建议这么干,不同的解释器可能存在解释的变量名不一致的问题
per._Person__money = 1
print(per.getMoney())
# 4.特殊情况
# 在Python中 __xxx__ 属于特殊变量,将不再属于私有变量,可以直接访问
print(per.__age__)
# 在python中 __xxx变量,这样的实例变量外部是可以访问的,但是,按照约定的规则
# 当我们看到这样的变量时,意思虽然是"虽然我可以被访问,但是请把我视为私有变量,不要直接访问我"
print(per._Person__height)

输出:

10000
10
1
20
170

继承

1、概念

如果两个或者两个以上的类具有相同的属性和方法,我们可以抽取一个类出来,

在抽取的类中声明公共的部分

​ 被抽取出来的类 ——父类 超类 基类
​ 其他类 —— 子类 派生类
​ 他们之间的关系 ——子类继承自父类

2、单继承

简单来说,一个子类只有一个父类,被称为单继承

演示:test.py 文件

注意:在使用继承时,尽量一个类存在于一个模块中

from person import Person
from student import Student
from worker import Worker
per = Person("aa", 1, 2)
stu = Student("tom", 18, 12345, 110)
print(stu.name, stu.age)
stu.run()
print(stu.stuId)
#私有属性
#print(stu.__money)
print(stu.getMoney())#通过继承过来的共有方法访问私有属性
#stu.stuFunc()
wor = Worker("lilei", 20, 111)
print(wor.name, wor.age)
wor.eat("apple")
#子类对象调用父类同名的函数,则优先调用子类中的函数
#本质是子类中的方法覆盖了父类中同名的函数
wor.run()
print(per.getMoney())
#父类对象不能访问子类特有的属性或方法
#print(per.stuId)

输出:

tom 18
run
110
12345
lilei 20
eat apple
子类中的run方法被调用了
2

person.py文件:

#以前的写法 class Person(object):
#但是实质上,如果没有显示的写出父类,则这个类的父类默认为object
#object是所有类的父类或者超类
class Person(object):
 #构造方法
 def __init__(self, name, age, money):
  self.name = name
  self.age = age
  self.__money = money
  #get/set方法
 def setMoney(self, money):
  self.__money = money
 def getMoney(self):
  return self.__money
 def run(self):
  print("run")
 def eat(self, food):
  print("eat", food)
#student.py文件
from person import Person
class Student(Person):
 def __init__(self, name, age, money, stuId):
  #调用父类中的构造方法
  #方法1 super(当前类,self).__init__(参数列表)
  #super(Student,self).__init__(name, age, money, stuId)
  #方法2 父类名.__init__(属性列表)
  Person.__init__(self, name, age, money)
  #子类可以有一些自己独有的属性
  self.stuId = stuId
 def setFunc(self):
  print(self.__money)
#worker.py文件
from person import Person
class Worker(Person):
 def __init__(self, name, age, money):
  super(Worker,self).__init__(name, age, money)
 # 在子类中定义和一个父类中重名的函数
 def run(self):
  print("子类中的run方法被调用了")

总结:

继承的特点:

a. 子类对象可以直接访问父类中未私有的对象
b. 子类对象可以调用父类中的方法
c. 父类对象不能访问子类中特有的属性或者方法

优缺点:

优点:

1.可以简化代码,减少冗余
2.提高代码的维护性
3.提高了代码的安全性

缺点:

耦合和内聚被用来描述类与类之间的关系,耦合性越低,内聚性越高,说明代码越好。
但是,在继承关系中,耦合性相对比较高,如果修改父类,子类也会随着变化。

3、多继承

顾名思义:就是一个子类中可以有多个父类,比如一个孩子有一个爸爸一个妈妈

from child import Child
def main():
 c = Child(300, 100,"xiaoming")
 print(c.money, c.faceValue)
 c.play()
 c.eat()
 #注意:如果多个父类中的方法名相同,默认调用的是子类括号中排前面的父类中的方法
 #此时调用的是Father中func方法
if __name__ == "__main__":
 main()

输出:

300 100
play
eat

#father.py文件
class Father(object):
 def __init__(self, money):
  self.money = money
 def play(self):
  print("play")
 def func(self):
  print("Father")
#mother.py文件
class Mother(object):
 def __init__(self, faceValue):
  self.faceValue = faceValue
 def eat(self):
  print("eat")
 def func(self):
  print("Mother")
#child.py文件
from father import Father
from mother import Mother
class Child(Father, Mother):
 def __init__(self, money, faceValue,name):
  #注意:分别调用各个父类中的构造方法
  Father.__init__(self, money)
  Mother.__init__(self, faceValue)
  #子类中同样可以有自己独有的特性
  self.name = name

总结:

子类可以从多个父类中继承属性和方法
一个父类可以有多个子类
一个子类可以有多个父类

4、函数重写

4.1、系统函数

'''
重写:将函数重写一遍
__str__():在调用print打印对象时自动调用,是给用户用的,是一个描述对象的方法.
__repr__():是给机器用的,在python解释器里面直接敲对象名在回车后调用方法
注意:在没有str,且有repr时,str=repr
'''
class Animal(object):
 def __init__(self, name, age, height, weight):
  self.name = name
  self.age = age
  self.height = height
  self.weight = weight
 def __str__(self):
  return "%s-%d-%d-%d"%(self.name, self.age, self.height, self.weight)
ani = Animal("大黄", 5, 60, 25)
#print(per.name, per.age, per.height, per.weight)
#在打印ani时自动调用str函数
print(ani)
#优点或者使用时机:当一个对象的属性值很多,并且都需要打印,重写__str__方法后,简化了代码,方便查看.

输出:

大黄-5-60-25

5、自定义函数

重写函数的时机:当父类中函数的功能满足不了子类的需求时,就可以进行重写。
演示:

from smallAnimal import SmallAnimal
from cat import Cat
c = Cat()
c.func()
#smallAnimal.py文件
class SmallAnimal(object):
 def func(self):
  print("wwww")
#cat.py文件
from smallAniml import SmallAnimal
class Cat(SmallAnimal):
 def func(self):
  print("呵呵呵")

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中使用wxPython开发的一个简易笔记本程序实例
Feb 08 Python
JPype实现在python中调用JAVA的实例
Jul 19 Python
Python数据结构之单链表详解
Sep 12 Python
利用Python暴力破解zip文件口令的方法详解
Dec 21 Python
python通过tcp发送xml报文的方法
Dec 28 Python
Python定时任务随机时间执行的实现方法
Aug 14 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
pycharm工具连接mysql数据库失败问题
Apr 01 Python
python实现斗地主分牌洗牌
Jun 22 Python
Python pytesseract验证码识别库用法解析
Jun 29 Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 Python
详解python3 + Scrapy爬虫学习之创建项目
Apr 12 #Python
Python2和Python3的共存和切换使用
Apr 12 #Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 #Python
Python、 Pycharm、Django安装详细教程(图文)
Apr 12 #Python
Python面向对象程序设计构造函数和析构函数用法分析
Apr 12 #Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 #Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 #Python
You might like
PHP define函数的使用说明
2008/08/27 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
2016/10/11 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
python分布式环境下的限流器的示例
2017/10/26 Python
TensorFlow变量管理详解
2018/03/10 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
python中如何打包用户自定义模块
2020/09/23 Python
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
励志演讲稿范文
2014/04/29 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
花木兰观后感
2015/06/10 职场文书
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android