【知识点】

面向对象的三大特性:继承、多态、封装

【继承】

(1)继承:class Person(Animal): ——括号里的:父类,基类,超类   括号外的:子类,派生类

 class Animal:
def __init__(self,name,sex,age):
self.name=name
self.sex=sex
self.age=age class Person(Animal):
pass p1=Person('小明','男',20)
print(p1.__dict__) # {'name': '小明', 'sex': '男', 'age': 20}

(2)初识继承:子类以及子类实例化的对象  可以访问父类的任何方法或变量

  #1、类名可以访问父类的所有东西

 class Animal:
breath='呼吸' def __init__(self,name,sex,age):
self.name=name
self.sex=sex
self.age=age def eat(self):
print("动物都需要吃东西...") class Person(Animal):
pass print(Person.breath) # 呼吸 (用类名进行访问)
Person.eat(111) # 动物都需要吃东西... (类名访问方法)

  #2、子类实例化的对象也可以访问父类所有东西

 p1=Person('小明','男',20)
print(p1.breath) # 呼吸 (用子类实例化对象访问父类静态变量)
p1.eat() # 动物都需要吃东西... (用子类实例化对象访问父类方法)

  #3、查询顺序

(3)继承关系中执行方法

  #1、只执行父类的方法:子类中不要定义与父类用名的方法

  #2、只执行子类的方法,在子类中创建这个方法

  #3、既要执行父类中的方法也要执行子类中的方法?

    两种解决方法:

    ① 在自己的类中调用父类的__init__方法(Animal.__init__(self,name,sex,age)。

    并且,在自己的类中定义def __init__(self,name,sex,age,wing)  在下面添加self.wing=wing

 # 既要执行父类中的方法也要执行子类中的方法?
# 解决方法1:
class Animal: def __init__(self,name,sex,age):
self.name=name
self.sex=sex
self.age=age def eat(self):
print("%s吃东西" % (self.name)) class Bird(Animal): def __init__(self,name,sex,age,wing):
# 类名调用方法需要全部参数,若是对象,不需要self
Animal.__init__(self,name,sex,age) #调用父类的__init__方法
self.wing=wing def bark(self):
print("唧唧叫") b=Bird('鹦鹉','公',20,'绿翅膀')
print(b.__dict__) # {'name': '鹦鹉', 'sex': '公', 'age': 20, 'wing': '绿翅膀'}

    ②super(本类,self).__init__(name,sex,age)  #可以简写:super().__init__(name,sex,age)

 # 解决方法2:
class Animal: def __init__(self,name,sex,age):
self.name=name
self.sex=sex
self.age=age def eat(self):
print("%s吃东西" % (self.name)) class Bird(Animal): def __init__(self,name,sex,age,wing):
# 类名调用方法需要全部参数,若是对象,不需要self
#Animal.__init__(self,name,sex,age) #调用父类的__init__方法
super().__init__(name,age,wing) #简写 原本:super(Bird,self).__init__(name,sex,age)
self.wing=wing def bark(self):
print("唧唧叫") b=Bird('鹦鹉','公',20,'绿翅膀')
print(b.__dict__) # {'name': '鹦鹉', 'sex': '公', 'age': 20, 'wing': '绿翅膀'}

(4)继承的进阶

  继承:单继承、多继承

  类:经典类,新式类

  #1、新式类:凡是继承object类都是新式类

    python3x 所有的类都是新式类。 因为python3x中的类都默认继承object

  #2、经典类:不继承object类都是经典类

    python2x 所有的类默认都不继承object类,所有的类默认都是经典类

    ★在python2x中出现如下情况为新式类:

 class A(object):
pass

    因此,python2x中既有经典类也有新式类

  #3、单继承:新式类、经典类查询顺序一样(依次往上)

   #4、多继承:

     新式类:遵循广度优先

     经典类:遵循深度优先

    ①多继承新式类:class F(D,E):   查询类的继承顺序方法:print(类名.mro())

    一条路走到倒数第二级,然后判断,如果其他路能走到终点,则返回走另一条路,否则走到终点。(每个节点只走一次)

    ②多继承经典类:(一条路走到底)

  #5、继承的优点:

    节省代码,优化代码

    提高代码的复用性,提高代码的维护性,让类与类之间发生关系

【一道面试题】

 class A:
name = [] p1 = A()
p2 = A()
p1.name.append(1)
# p1.name,p2.name,A.name 分别是什么?

分析:一般说对象调用类中的静态变量是不能修改的。常规思路肯定认为这里会报错,但是这有个坑,静态变量是可变的数据类型。思路如下:

在名称空间里,A.name获取的是列表的内存地址(房间号),而往其中放入一个数,那是没有问题的。因此有如下结果

 class A:
name = [] p1 = A()
p2 = A()
p1.name.append(1)
# p1.name,p2.name,A.name 分别是什么?
print(p1.name) #[1]
print(p2.name) #[1]
print(A.name) #[1]

时间:2020-02-12     16:12:50

最新文章

  1. 用Java来写常见的排序算法
  2. underscore.js依赖库函数分析二(查找)
  3. iOS 基础日记-修饰符
  4. 号外号外:9月13号《Speed-BI云平台案例实操--十分钟做报表》开讲了
  5. 常用加密算法的Java实现总结
  6. 杭电ACM2011-- 多项式求和
  7. nand flash 扇区的管理以及初始化
  8. [转] Web前端优化之 Server篇
  9. HTTP状态码(HTTP Status codes)简介
  10. Infinite scroll has been called autopagerize, unpaginate, endless pages
  11. hdu1881 毕业bg(深搜索dfs)
  12. Linux中grep命令学习
  13. 身份证识别OCR,开启视频模式扫一扫即可识别身份证信息
  14. java web开发中遇到的问题及解决方案(个人学习日志,持续更新)
  15. [bzoj4771] 七彩树
  16. adobe cc最新版 软件安装与激活
  17. python格式化字符串Type Error: Format Requires Mapping 的问题
  18. UDP网路会议室的代码
  19. thinkphp5报错
  20. 优云亮相GOPS2017全球运维大会 “黑科技”获全场最高关注

热门文章

  1. 洛谷P1029 最大公约数和最小公倍数问题 题解
  2. SSM三大框架整合思路
  3. 比特币学习笔记(一)---在windows下编译搭建比特币环境
  4. Qt5学习(1)
  5. react 表单(受控组件和非受控组件)
  6. [Micropython]TPYBoard v202 智能WIFI远控小车
  7. springboot2 整合redis
  8. Unity_Dungeonize 随机生成迷宫
  9. Ubuntu18.04 安装配置mongodb
  10. CSS基础应用总结