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遍历目录的4种方法实例介绍
Apr 13 Python
Python判断文件和文件夹是否存在的方法
May 21 Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
python pandas修改列属性的方法详解
Jun 09 Python
简单了解python代码优化小技巧
Jul 08 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
使用jupyter notebook直接打开.md格式的文件
Apr 10 Python
Python小白垃圾回收机制入门
Jun 09 Python
python 中的命名空间,你真的了解吗?
Aug 19 Python
python 爬取小说并下载的示例
Dec 07 Python
使用python+pygame开发消消乐游戏附完整源码
Jun 10 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
德生PL990的分析评价
2021/03/02 无线电
PHP中使用CURL获取页面title例子
2015/01/07 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
js 作用域和变量详解
2017/02/16 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
2017/09/28 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
如何定义TensorFlow输入节点
2020/01/23 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
python如何停止递归
2020/09/09 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
职工趣味运动会方案
2014/02/10 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
离婚协议书范文
2015/01/26 职场文书
golang 实用库gotable的具体使用
2021/07/01 Golang
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python