PS:在python3中,object是所有类的基类。也就是说只要我们定义了一个类,这个类最终的基类都是object类。(Object是python3中所有类的祖宗类)

所以在以后定义类时,如果没有父类建议统一继承自object。

class 类名(object):pass

面向对象开发的3大特性:封装、继承、多态。

1、针对Person类

2、针对于户型添加家具(哪一个类要被使用到就应该先开发那个类)

class HouseItem:def __init__(self,name,area):self.Name=nameself.Area=areadef __str__(self):return "家具 %s 占地面积%.2f"%(self.Name,self.Area)
bed=HouseItem("席梦思",130)
chest=HouseItem("衣柜",2)
table=HouseItem("餐桌",1.5)
print(bed)
print(chest)
print(table)class House:def __init__(self,house_type,area):#户型和总面积应该由外界传递self.House_type=house_typeself.Area=areaself.free_area=area#一个新房没有任何家具,所以剩余面积就等于总面积(剩余面积不需要由外界传递)self.item_list=[]#新房子没有家具初始的时候只是一个空列表,所以在定义形参的时候只需要为户型和总面积传递两个形参就可以def __str__(self):return ("该房子户型%s,总面积%.2f,添加了%s家具,[该房子剩余面积]%.2f"%(self.House_type,self.Area,self.item_list,self.free_area))  def add_item(self,item):#判断家具面积if item.Area>self.free_area:print("%s该家具放不下"%item.Name)return#只要return执行下方的代码就不会执行#将家具的名称添加到列表中self.item_list.append(item.Name)#计算剩余面积self.free_area-=item.Areamy_home=House("3室",120)
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print(my_home)

结果:

3、(重点:一个对象的属性可以是另外一个类创建的对象)

class Gun:def __init__(self,model):self.Model=modelself.bullet_count=0def add_bullet(self,count):self.bullet_count+=countdef shoot(self):#判断子弹数量if self.bullet_count<=0:print("%s没有子弹了"%self.Model)return#发射子弹(-1)self.bullet_count-=1#提示发射子弹数量print("[%s]剩余子弹[%d]"%(self.Model,self.bullet_count))class Soldier:def __init__(self,name):self.Name=name#因为新兵没有枪self.Gun=None#(使用None即定义属性又不设置具体的抢对象)"""在初始化方法中定义这个属性,避免了在给属性添加对象时,不要在外界添加这个属性,而应该在初始化方法内部先把这个属性添加好,如果想要修改这个属性的值,我们再在外部使用赋值语句给这个属性设置一个新对象就可以"""      def fire(self):#判断自己是否有枪#if self.Gun==None:#==是比较变量的值是否相等的if self.Gun is None:#身份运算符是用来比较内存的地址的print("[%s]还没有枪"%self.Name)return#枪装子弹self.Gun.add_bullet(10)#发射子弹self.Gun.shoot()#创建枪对象
AK47=Gun("AK47")
#AK47.add_bullet(10)#枪自己并不能装填子弹
#AK47.shoot()#枪自己并不能发射,需要士兵完成#创建许三多士兵对象
xusanduo=Soldier("许三多")
#在主程序中使用赋值语句给xusanduo赋值枪
xusanduo.Gun=AK47
xusanduo.fire()
print(xusanduo.Gun)

结果:

4、私有属性和私有方法

在定义属性和方法时,在属性名或者方法名前增加两个下划线,定义的就是私有属性和方法。

私有属性和方法的应用场景就是:在实际开发中对象的某些属性和方法可能只希望在对象的内部被使用,而不希望在外部被访问到。

PS:私有属性只是禁止在外界访问,而在对象的方法内部仍然正常访问。

在对象的方法内部是可以访问属性以及自己的私有属性的。在外界不能调用对象的私有属性或者私有方法。

虽然子类对象不能在自己的方法内部,直接访问父类的私有属性和私有方法;但是子类对象可以通过父类的公有方法间接访问到私有属性或者私有方法。

私有属性、方法是对象的隐私,不对外公开,外界以及子类都不能间接访问。

私有属性、方法通常用于做一些内部的事情。

class Women:def __init__(self,name,age):self.Name=nameself.__Age=age#在对象的方法内部,是可以访问对象的私有属性的def secret(self):print("%s的年龄是%d"%(self.Name,self.__Age))
xiaofang=Women("小芳",18)
#私有属性,在外界不能够被直接访问
#print(xiaofang.__Age)#报错:'Women' object has no attribute '__Age'
xiaofang.secret()#输出:小芳的年龄是18(在对象的方法内部,是可以访问对象的私有属性的)

5、继承:子类拥有父类的所有方法和属性

继承的语法:

class 类名(父类名):pass

子类继承自父类,可以直接享受父类中已经封装好的方法,不需要再次开发。

子类中应该根据职责,封装子类特有的属性和方法。

PS:父类私有的属性和方法,是属于父类的;子类是无法访问到的。但是子类对象可以通过父类的公有方法间接访问到私有属性或者私有方法。

5.1覆盖父类的方法

父类中封装的方法不能满足子类的需要时,可以对方法进行重写。(对父类的方法进行重写是完全覆盖了父类的方法)

具体的方式就是:在子类中定义一个和父类同名的方法并且实现。重写之后在运行时,只会调用子类中重写的方法,而不会调用父类封装的方法。

5.2对父类的方法进行扩展

如果在开发中,子类的方法实现中,包含父类的方法实现。(也就是说父类原本封装的方法实现是子类方法的一部分,但是父类的方法只能满足子类方法所需的一部分功能,这个时候就需要使用扩展的方式,在子类中对父类的方法进行一个扩展补充)

扩展的方式:(在子类中对父类的方法进行扩展,但是仍然保留了父类中的方法,没有完全覆盖)

  1. 在子类中重写父类的方法。
  2. 在这个方法中,在需要的位置使用super().父类方法来调用父类方法的执行。
  3. 代码其他的位置针对子类的需求,编写子类特有的代码实现。

关于super:

  • 在python中super是一个特殊的类。
  • super()就是使用super类创建出来的对象。(super类后边跟这个一个小括号可以创建对象)
  • 最常使用的场景就是在重写父类方法时,调用在父类中封装的方法实现。
class Animal:def eat(self):print("动物会吃")def drink(self):print("动物会喝")def bark(self):print("动物会叫")
class Dog(Animal):def swim(self):print("狗会游泳")def bark(self):print("狗会汪汪叫")
class XiaoTianQuan(Dog):def fly(self):print("哮天犬会飞")def bark(self):#1、针对子类特有的需求编写代码print("我是哮天犬,比一般的狗叫的更大声")#2、使用super().调用原来在父类中封装的方法super().bark()#如果把super方法注释掉,就不会调用到父类的方法了"""如果在子类中需要用到父类的方法,那么我们就在子类中使用super()这个特殊的对象来调用父类方法的实现;而在其他的位置我们就可以根据子类特有的需求来编写特有的代码就可以"""#3、增加其他子类的代码print("我是神狗")
xtq=XiaoTianQuan()
xtq.bark()

结果:

6、多继承

上述定义子类的小括号内只有一个父类,我们叫做单继承。而在python中,子类是可以拥有多个父类的,并且具有所有父类的属性和方法。

语法:

class 子类(父类1,父类2...):pass

Q:如果不同的父类中,存在同名的方法,子类对象在调用方法时,会调用哪一个父类的方法?

A:首先在开发时应该尽量避免这种混淆的情况;如果父类之间存在同名的属性和方法,应该尽量避免使用多继承。(如果非要一样的话,那么是根据先后的继承顺序来执行的,小括号内的父类哪个在前调用哪个)

7、多态

一个是调用子类的方法,一个是调用父类中的方法。

8、类中的术语:

PS:假如我们使用class关键字定义了一个类,程序在运行时这个类会不会被加载到内存呢?应该会的。假设我们在定义一个类之后,在程序运行时是不是可以使用这个类来创建出很多很多个对象,在对象的内存空间中保存的是什么内容呢?在对象的内存空间中保存的是不同对象各自不同的属性,而对象的实例方法是保存在类所在的内存空间的,当我们让某一个对象调用实例方法时,这个对象会把自己的引用当做参数传递给这个方法,因此对象的实例方法是保存在类所在的内存空间的,类在运行的时候同样也会被加载到内存。、

class  ABC:#定义的类属于类对象。

object1=ABC()#属于实例对象。

除了可以封装实例的属性和方法之外,也可以访问类的属性或者调用类的方法。(因为类是一个特殊的对象,可以拥有自己的属性和方法,即类属性、类方;所以可以通过类名.的方式访问类的属性或者调用类的方法)(还有一种访问类属性的方式但是不推荐使用,对象.类属性)

1、可以使用赋值语句定义类属性。

定义类属性。

2、定义类方法

3、静态方法

通过类名.调用静态方法,不需要创建对象。

9、综合示例演示

class Game(object):top_score=100#类属性@staticmethoddef show_help():print("帮助信息")@classmethoddef show_top_score(cls):print("这个游戏的历史最高分是%d"%cls.top_score)def __init__(self,name):self.player_name=name#实例属性def start_game(self):print("%s可以开始游戏了"%self.player_name)
#查看游戏的帮助信息
Game.show_help()
#查看历史最高分
Game.show_top_score()
#穿件游戏对象
chiji=Game("小明")
chiji.start_game()

结果:

  

python基础知识整理 第六节:面向对象封装练习相关推荐

  1. python基础知识整理 第七节:单例设计模式、异常、模块、包、制作模块、文件

    1.单例设计模式 单例设计模式就是为对象在内存中分配空间的时候,永远只会返回一个唯一的固定的内存空间.这样就能保证在内存中这个类的对象只有唯一的一份,这个就叫做单例.(为对象分配空间使用的是内置方法_ ...

  2. python基础知识整理-python爬虫基础知识点整理

    首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫 ...

  3. Python基础知识整理(含思维导图)

    ✔️ Python基础知识 Python内置对象 数字 int ,float ,complex 实例:123,3.14 python 数字类型 整数 二进制 0,1 必须0b开头 八进制 0-7 必须 ...

  4. python基础知识资料-python基础知识整理(值得收藏)

    近些年python语言非常流行,许多开发者都会学习一些python相关知识,本文为大家整理了python的一些基础知识,希望对大家有一定的帮助. 注:下文Python代指Python3. 基本信息和J ...

  5. python基础知识-python基础知识整理(值得收藏)

    近些年python语言非常流行,许多开发者都会学习一些python相关知识,本文为大家整理了python的一些基础知识,希望对大家有一定的帮助. 注:下文Python代指Python3. 基本信息和J ...

  6. python基础知识整理-整理了27个新手必学的Python基础知识点

    原标题:整理了27个新手必学的Python基础知识点 1.执行脚本的两种方式 Python a.py 直接调用Python解释器执行文件 chomd +x a.py ./a.py #修改a.py文件的 ...

  7. python基础知识整理-python入门基础知识点整理-20171214

    一.知识点整理 1.python2与python3的区别: (1)宏观比对 python2 源码不标准,较为混乱,并且重复的代码很多. python3 源码统一了标准,同时也去除了重复代码. (2)编 ...

  8. python基础知识整理一

    文章目录 1.Python中的数据类型有哪些 1.字符串 1)字符串的常用方法 2)正则表达式 2.列表:list enumerate.zip函数 3.元组:tuple 4.字典:dict 5.集合: ...

  9. python升级知识整理 第四节: 面向对象

最新文章

  1. Android社招最全面试题,妈妈再也不用担心我找工作了!
  2. react ui框架_顶级React组件库推荐
  3. 一篇讲清:如何构建可重复,可扩展且盈利的“魔力”转化流程?
  4. C语言 函数声明和调用 - C语言零基础入门教程
  5. 服务器屏蔽非法app请求
  6. 信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport...
  7. 想搞一套AI问答游戏系统?简单,Google又开源了
  8. html3d变形,深入理解CSS变形transform(3d) - 小火柴的蓝色理想
  9. Android与物联网设备通信-概念入门
  10. javascript--返回顶部效果
  11. 用友集团前端面经整理及答案
  12. 虚拟数字人的“风”,从“工业级”吹向“消费级”
  13. word文档如何画线条流程图_Word中流程图如何画 手把手教你制作!
  14. 小程序的转发分享功能
  15. linux redis-trib.rb,redis集群配置 执行 redis-trib.rb 报错解决方法
  16. 你为什么要进入IT行业呢?
  17. 今日恐慌与贪婪指数为23,恐慌程度有所下降
  18. 【推荐系统算法实战】协同过滤 CF 算法(Collaborative Filtering)
  19. WIN7电脑如何共享WiFi
  20. 计算机三维动画学什么,计算机三维动画设计教学大纲..doc

热门文章

  1. 2021年大数据Hadoop(三):Hadoop国内外应用
  2. Android 人民币符号在布局中实现的效果不一样的处理方法
  3. RxJava repeat,repeatWhen,repeatUntil 的区别
  4. Android编程:解决异常“android.view.InflateException: Binary XML file line # : Error inflating class”
  5. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)
  6. Docker不香吗,为啥还要K8s?
  7. Python 精选笔试面试习题—sorted 与 sort 单例模式、统计字符个数Count、垃圾回收、lambda函数、静态方法、类方法、实例方法、分布式锁、
  8. Linux 终端推荐 Terminator
  9. 【转】oracle PLSQL基础学习
  10. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...