文章目录

  • 一、slots
  • 二、私有属性和私有方法
  • 三、继承
    • 1、私有属性、私有方法
    • 2、继承的特点(多层继承)
    • 3、新式类和经典类
  • 四、方法的重写
  • 五、多态

一、slots

  • __slots__属性对应的是元组类型的值
  • 规定对象可以使用的属性,只有在元组里出现的值,才能设置给对象
class Person(object):__slots__ = ('name', 'age') # 要的是一个元祖( )def __init__(self, name, age):self.name = nameself.age = agep = Person('zhangsan', 18)  # 对象P,有姓名和年龄属性
p.addr = '上海'# 会报错AttributeError: 'Person' object has no attribute 'addr',要想不报错,需要把addr加入至slots参数中
# 如果没有__slots__方法,不会报错,因为python支持动态类型,加属性是OK的

二、私有属性和私有方法

  • 1、私有属性:添加两个下划线(self.__money),这种属性我们称之为私有属性,只能在内部访问,不能在外部访问
  • 使用内部方法可以访问,返回该私有属性return self.__money
  • print(p._Person__money)可以使用 对象名._类名__私有属性名 来强制访问私有属性,不建议使用该方式
  • 2、私有方法:私有方法使用 __ 开始,定义的私有方法__demo只让内部使用,外部无法访问
  • p._Person__demo() 可以通过对象名._类名__私有方法名强制访问,不建议使用该方式

import timeclass Person(object):def __init__(self, name, age, money):self.name = nameself.age = age# 添加两个下划线,这种属性我们称之为私有属性,只能在内部访问,不能在外部访问self.__money = moneydef get_money(self):  # 内部可以访问money,然后外部再调用该方法,作为一个接口(连接内外)print('{}查询余额了!!!!'.format(time.asctime()))  # 查询余额时间return self.__moneydef set_money(self, money):print('修改余额了!!!')self.__money = moneydef test(self):self.__demo()print('加密以后的代码1')print('加密以后的代码2')print('加密以后的代码3')print('加密以后的代码4')print('加密以后的代码5')print('我是person里的test函数')def foo(self):  # 定义的私有方法__demo只让内部使用self.__demo()# 私有方法使用 __ 开始def __demo(self):print('加密第1步')print('加密第2步')print('加密第3步')print('加密第4步')print('加密第5步')print('加密第6步')print('加密第7步')p = Person('zhangsan', 18, 2000)
p.test()
print(p.get_money())# p.__demo()  私有方法,外部无法访问
# p._Person__demo()  可以通过对象名._类名__私有属性名强制访问,不建议使用该方式p.set_money(1500)
print(p.get_money())# 如果想要访问私有属性,可以使用  对象名._类名__私有属性名  来强制访问
# print(p._Person__money)   # 强烈不推荐使用这种方式来访问私有属性# 私有属性 __money 在外部不能直接访问
# print(p.__money)
# p.__money -= 500
# print(p.__money)

三、继承

1、私有属性、私有方法

  • 私有属性不会被子类继承;
  • 私有方法也不会被子类继承;
  • Student 类继承自 Person 类,就可以使用Person类里的方法;
  • s 对象还可以调用自己类的方法
class Person(object):def __init__(self, name, age):self.name = nameself.age = ageself.money = 1000self.__xxx = 'hello'  # 私有属性def eat(self):print(self.name + '正在吃饭')def sleep(self):print(self.name + '正在睡觉')def __foo(self):print('fooooooooooooooooooooooooooo')class Student(Person):# def __init__(self, name, age, school):#     self.name = name#     self.age = age#     self.school = schooldef study(self):# print(self.__xxx)    私有属性不会被子类继承# self.__foo()  私有方法也不会被子类继承print(self.name + '正在学习')# s = Student('zhangsan', 18, '春天花花幼稚园')
s = Student('zhangsan', 18)
print(s.money)  # 1000# Student 类继承自 Person 类,就可以使用Person类里的方法
s.eat()# s 对象还可以调用自己类的方法
s.study()

2、继承的特点(多层继承)

父类(基类)、子类(派生类)

  • 当调用一个对象的属性或者方法时,会按照__mro__属性指定的属性查找,如果找到了就直接停止;如果最后都没找到,就报错!!!
class Animal(object):def eat(self):print('动物正在吃东西')def sleep(self):print('动物正在睡觉')def demo(self):print('我是animal里的demo方法')class Person(Animal):def drive(self):print('人正在开车')def make_money(self):print('挣了一点点点点钱')class Dog(Animal):def bark(self):print('狗正在叫')class RichPeople(Animal):def make_money(self):print('富人挣了好多好多好多钱')class Boss(object):def offer(self):print('老板把公司给你了')def demo(self):print('我是boss里的demo方法')class Student(RichPeople, Person, Boss):  # 多继承def study(self):print('学生正在学习')class Teacher(Person):def teach(self):print('老师正在上课')s = Student()  # 实例化一个对象s
s.study()
s.drive()
s.eat()
s.make_money()
s.offer()
s.demo()  # 我是animal里的demo方法,会按照父类顺序调用
s.xxx()  # 会报错,因为所有父类都没有该方法# (<class '__main__.Student'>, <class '__main__.RichPeople'>, <class '__main__.Person'>, <class '__main__.Animal'>, <class '__main__.Boss'>, <class 'object'>)
# 当调用一个对象的属性或者方法时,会按照  __mro__ 属性指定的属性查找,如果找到了就直接停止;如果最后都没找到,就报错!!!
print(Student.__mro__)

3、新式类和经典类

新式类:继承自object的类是新式类
经典类: 没有继承自object的类
在python3以后,如果创建一个类不指定父类,默认继承自object,python3没有经典类

class Person(object):def test(self):print('hello')p = Person()
p.test()
print(Person.__mro__)  # (<class '__main__.Person'>, <class 'object'>)

四、方法的重写

  • 子类在父类的基础上又扩展了自己的功能:父类名.函数名(参数),此时需要传参数self
  • 即在调用子类test方法前,先调用父类的test方法,即子类扩展了父类的方法,先调父类的方法,再做子类的实现
  • super().函数名()
class Person(object):def __init__(self, name, age):self.name = nameself.age = ageself.money = 1000def test(self):print(self.name + ' say hello')class Student(Person):def __init__(self, name, age, school):# 子类在父类的基础上又扩展了自己的功能# 父类名.函数名(参数)# Person.__init__(self, name, age)# super().函数名()super().__init__(name, age)self.school = schooldef study(self):print('学生正在学习')def test(self):# Person.test(self)  # super().test()  # 在调用子类test方法前,先调用父类的test方法,即子类扩展了父类的方法,先调父类的方法,再做子类的实现print('hehe')s = Student('zhangsan', 18, '春田花花幼稚园')
print(s.money)
s.test()  # zhangsan say hello hehe此时先调用的是父类的test方法,后调用子类的test方法
# s.study()

五、多态

多态:不同的子类对象,调用相同的父类方法,得到的结果可能不一样

#  1、不使用多态时class SearchDog(object):def sd_work(self):print('搜救犬正在搜索生命')class PoliceDog(object):def pd_work(self):print('警犬正在抓坏人')class FlyDog(object):def fd_work(self):print('飞天犬正在飞')class Person(object):def __init__(self, dog=None):self.dog = dogdef work_with_sd(self):self.dog.sd_work()def work_with_pd(self):self.dog.pd_work()def work_with_fd(self):self.dog.fd_work()p = Person()sd = SearchDog()
pd = PoliceDog()
fd = FlyDog()p.dog = sd  # 换一条狗就得换相应的方法
p.work_with_sd()
#  2、使用多态时
class Dog(object):def dog_work(self):print('狗正在工作')# 都继承Dog类
class SearchDog(Dog):def dog_work(self):  # 重写Dog方法print('搜救犬正在搜索生命')class PoliceDog(Dog):def dog_work(self):print('警犬正在抓坏人')class FlyDog(Dog):def dog_work(self):print('飞天犬正在飞')class BlindDog(Dog):def dog_work(self):print('导盲犬正在领路')class Person(object):def __init__(self, dog=None):self.dog = dogdef work_with_dog(self):self.dog.dog_work()  # self.dog找到导盲犬 ,然后调用dog_work()方法,而BlindDog()又重写类该方法sd = SearchDog()
pd = PoliceDog()
fd = FlyDog()
bd = BlindDog()p = Person(bd)  # 将bd传入,即BlindDog导盲犬,如果调用其他就把参数传入即可
p.work_with_dog()  # 导盲犬正在领路

Python基础——继承、多态相关推荐

  1. python基础——继承与派生、组合

    python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...

  2. Python的继承多态

    Python的继承多态 文章目录 Python的继承多态 一.私有属性和私有方法 01. 应用场景及定义方式 02. 伪私有属性和私有方法 二.单例 01. 单例设计模式 单例设计模式的应用场景 02 ...

  3. python封装继承多态_Python:封装、继承、多态、私有成员

    Python作为一种面向对象语言,也有着面向对象的三种特性:封装.继承.多态. 封装: 将事物相关的属性和方法封装在某一个类里面,使得在调用类创建实例时,可以不用关心类内部的实现细节. 类的本质: 1 ...

  4. python封装 继承 多态 举例_python面向对象中的封装、继承、多态

    封装 可以简单的理解为隐藏一切可以隐藏的实现细节,只向外界提供简单的编程接口.我们在类中定义的方法其实就是把数据和数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以 ...

  5. python封装继承多态_浅谈JavaScript的面向对象和它的封装、继承、多态

    写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...

  6. python基础 继承

    继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父 ...

  7. python基础------继承特性

    目录 一.定义 1.定义: 2.在Python3 中一个类没有继承另一个类,自动继承object类 二.继承语法 1.语法: 2.类的分类: 3.查看继承的父类 1.格式: 三.方法的复写 1.定义: ...

  8. pythond的执行原理_python基础——继承实现的原理

    python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self) ...

  9. Python基础day09【面向对象(封装、继承、多态)、重写、私有权限】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day09[面向对象(封装.继承.多态).重写.私有权限] Python基础day ...

最新文章

  1. 剑指offer 树的子结构
  2. 阿里云服务器ECS选型
  3. 企业混合云的VERITAS数据保护方案
  4. iOS开发使用UIKeyInput自定义密码输入框
  5. 移动端rem布局与高清屏幕适配
  6. 超简单的ubuntu18.04安装teamview
  7. 三层交换机与路由器的区别
  8. Cubieboard2开发要点简记
  9. 网站防篡改有什么方法
  10. 商品订单管理系统(参考答案)
  11. 各种艺术字、图片在线制作
  12. linux压缩到最小命令,Linux下压缩某个文件夹命令
  13. 概率初步(1 Juin, 2019)
  14. C语言第五章Structures Unions
  15. 基于FPGA的自动小车控制设计Verilog开发
  16. 嵌入式从业者应知应会知识点 - 索引
  17. Dobbo问题及解决方案:forbid-consumer
  18. Codejock Suite Crack,工作区更易于管理
  19. 创新对计算机专业的影响,“互联网+”学科竞赛对计算机专业学生创新能力培养的影响...
  20. Zookeeper详解(三)——开源客户端curator

热门文章

  1. torch.randn()函数
  2. css中脱离标准流的三种方式,CSS的三种手段让元素脱离标准本文档流
  3. 认认真真推荐几个一线IT大佬的公众号,值得收藏
  4. 【042】904. 水果成篮[滑动窗口]
  5. 2022-7-8 Leetcode 904.水果成篮
  6. ubuntu中截图工具shutter编辑按钮不可用
  7. 思维导图Java篇(一)
  8. linux arm内核栈切换,linux-kernel
  9. php电子杂志,Phpwind推电子杂志《站长天下》 网罗站长故事
  10. java正则表达式 位置_正则表达式(一)—位置锚定