Python基础——继承、多态
文章目录
- 一、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基础——继承、多态相关推荐
- python基础——继承与派生、组合
python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...
- Python的继承多态
Python的继承多态 文章目录 Python的继承多态 一.私有属性和私有方法 01. 应用场景及定义方式 02. 伪私有属性和私有方法 二.单例 01. 单例设计模式 单例设计模式的应用场景 02 ...
- python封装继承多态_Python:封装、继承、多态、私有成员
Python作为一种面向对象语言,也有着面向对象的三种特性:封装.继承.多态. 封装: 将事物相关的属性和方法封装在某一个类里面,使得在调用类创建实例时,可以不用关心类内部的实现细节. 类的本质: 1 ...
- python封装 继承 多态 举例_python面向对象中的封装、继承、多态
封装 可以简单的理解为隐藏一切可以隐藏的实现细节,只向外界提供简单的编程接口.我们在类中定义的方法其实就是把数据和数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以 ...
- python封装继承多态_浅谈JavaScript的面向对象和它的封装、继承、多态
写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...
- python基础 继承
继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父 ...
- python基础------继承特性
目录 一.定义 1.定义: 2.在Python3 中一个类没有继承另一个类,自动继承object类 二.继承语法 1.语法: 2.类的分类: 3.查看继承的父类 1.格式: 三.方法的复写 1.定义: ...
- pythond的执行原理_python基础——继承实现的原理
python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self) ...
- Python基础day09【面向对象(封装、继承、多态)、重写、私有权限】
视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day09[面向对象(封装.继承.多态).重写.私有权限] Python基础day ...
最新文章
- 剑指offer 树的子结构
- 阿里云服务器ECS选型
- 企业混合云的VERITAS数据保护方案
- iOS开发使用UIKeyInput自定义密码输入框
- 移动端rem布局与高清屏幕适配
- 超简单的ubuntu18.04安装teamview
- 三层交换机与路由器的区别
- Cubieboard2开发要点简记
- 网站防篡改有什么方法
- 商品订单管理系统(参考答案)
- 各种艺术字、图片在线制作
- linux压缩到最小命令,Linux下压缩某个文件夹命令
- 概率初步(1 Juin, 2019)
- C语言第五章Structures Unions
- 基于FPGA的自动小车控制设计Verilog开发
- 嵌入式从业者应知应会知识点 - 索引
- Dobbo问题及解决方案:forbid-consumer
- Codejock Suite Crack,工作区更易于管理
- 创新对计算机专业的影响,“互联网+”学科竞赛对计算机专业学生创新能力培养的影响...
- Zookeeper详解(三)——开源客户端curator
热门文章
- torch.randn()函数
- css中脱离标准流的三种方式,CSS的三种手段让元素脱离标准本文档流
- 认认真真推荐几个一线IT大佬的公众号,值得收藏
- 【042】904. 水果成篮[滑动窗口]
- 2022-7-8 Leetcode 904.水果成篮
- ubuntu中截图工具shutter编辑按钮不可用
- 思维导图Java篇(一)
- linux arm内核栈切换,linux-kernel
- php电子杂志,Phpwind推电子杂志《站长天下》 网罗站长故事
- java正则表达式 位置_正则表达式(一)—位置锚定