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九九乘法表的实例
Sep 26 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
Oct 01 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
python实现银联支付和支付宝支付接入
May 07 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
python的faker库用法
Nov 28 Python
tensorflow 模型权重导出实例
Jan 24 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
python logging通过json文件配置的步骤
Apr 27 Python
Python OpenCV中的numpy与图像类型转换操作
Dec 11 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在线生成二维码代码(google api)
2013/06/03 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
Less 安装及基本用法
2018/05/05 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
JS实现多功能计算器
2020/10/28 Javascript
Python反转序列的方法实例分析
2018/03/21 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
Django xadmin安装及使用详解
2020/10/26 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
偷看我的初中毕业鉴定
2014/01/29 职场文书
三分钟演讲稿事例
2014/03/03 职场文书
车贷收入证明范本
2014/09/14 职场文书
公司放假通知怎么写
2015/04/15 职场文书
音乐会主持人开场白
2015/05/28 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript