侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   193

本文实例讲述了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.__moneyper = 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 = 1print(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 Personfrom student import Studentfrom worker import Workerper = 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 Personclass 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 Personclass 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 Childdef 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 Fatherfrom mother import Motherclass 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 SmallAnimalfrom cat import Catc = Cat()c.func()
#smallAnimal.py文件class SmallAnimal(object): def func(self):  print("wwww")
#cat.py文件from smallAniml import SmallAnimalclass Cat(SmallAnimal): def func(self):  print("呵呵呵")

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

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


  • 上一条:
    Python中format()格式输出全解
    下一条:
    详解python3 + Scrapy爬虫学习之创建项目
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客