~~核心编程(四):面向对象——单继承&复写~~
进击のpython
*****
继承
继承的出现!就是一个作用!
为了节省代码!
为什么说节省代码?
你爸爸要是王健林
你是不是就不用愁怎么获得钱了?
为啥?
是不是钱已经有了!
直接拿来用就行了!
我们想一下奥
狗和人是不是都会吃东西?
那么吃东西这个东西是不是算是他俩的共有属性?
那我就可以把这个吃东西当作父类,让人和狗继承
# -*- coding: utf-8 -*-
# @Time : 2019.07.16
# @Author : 爪爪
# @Url : https://www.cnblogs.com/jevious/
class Animals:
def __init__(self, name, old):
self.name = name
self.old = old
print(f"{name},{old}岁")
class Dog(Animals): # 是不是原先都是没写的??现在就是有用的了!
pass
class Person(Animals):
pass
p = Person("zhangsan", 18)
d = Dog("ponny", 10)
以前Dog类后面不是没有括号嘛?
这回有了!括号里是他继承的父类
可以看出来,尽管Dog里面没有函数体
但是也看到了,执行了父类的代码
所以也就看到了继承了父类吧!
同时不光继承父类,也能够有自己的方法调用!
# -*- coding: utf-8 -*-
# @Time : 2019.07.16
# @Author : 爪爪
# @Url : https://www.cnblogs.com/jevious/
class Animals:
def __init__(self, name, old):
self.name = name
self.old = old
print(f"{name},{old}岁")
class Dog(Animals):
pass
class Person(Animals):
def info(self):
print(f"{self.name}是个人!")
p = Person("zhangsan", 18)
d = Dog("ponny", 10)
p.info()
属性&方法重写
比如说我们在刚才的父类里定义了动物类型是哺乳动物,因为哺乳动物占大多数嘛
但是有些动物就不是哺乳动物,我们继承了父类,那这个哺乳动物的这个属性
也就跟着过来了,我们想要修改他
很容易,只需要在特殊动物上自己重新定义就行
# -*- coding: utf-8 -*-
# @Time : 2019.07.16
# @Author : 爪爪
# @Url : https://www.cnblogs.com/jevious/ class Animals:
a_type = "哺乳" def __init__(self, name, old):
self.name = name
self.old = old print(f"{name},{old}岁,是{self.a_type}动物") class Dog(Animals):
pass class Person(Animals): def info(self):
print(f"{self.name}是个人!") class Snack(Animals):
a_type = "冷血动物"
pass p = Person("zhangsan", 18)
s = Snack("sheshe", 2)
d = Dog("ponny", 10)
zhangsan,18岁,是哺乳动物
sheshe,2岁,是冷血动物动物
ponny,10岁,是哺乳动物
同理,方法也可以这样重写
# -*- coding: utf-8 -*-
# @Time : 2019.07.16
# @Author : 爪爪
# @Url : https://www.cnblogs.com/jevious/ class Animals:
a_type = "哺乳" def __init__(self, name, old):
self.name = name
self.old = old print(f"{name},{old}岁,是{self.a_type}动物") def info(self):
print(f"{self.name}是个{self.a_type}动物!") class Dog(Animals):
pass class Person(Animals): def info(self):
print(f"{self.name}是个人!") class Snack(Animals):
a_type = "冷血动物" def info(self):
print(f"我是{self.name}的父类重写") pass p = Person("zhangsan", 18)
s = Snack("sheshe", 2)
d = Dog("ponny", 10) d.info() p.info() s.info()
zhangsan,18岁,是哺乳动物
sheshe,2岁,是冷血动物动物
ponny,10岁,是哺乳动物
ponny是个哺乳动物!
zhangsan是个人!
我是sheshe的父类重写
我的Snack类觉得你父类里面的info方法写的不好
我想自己重新写一个
所以就在自己的类里重新写上这个方法
重新定义(--init--也可以这么搞)
也可以看出来
当属性相同或者方法相同的时候
以子类为准!
同时执行子类&父类方法
那我有没有另外的一种情况
我Snack觉得你父类的info方法写的挺好,但是还不够好
我不修改你,我想在你的基础上再加点
怎么做呢?
# -*- coding: utf-8 -*-
# @Time : 2019.07.16
# @Author : 爪爪
# @Url : https://www.cnblogs.com/jevious/ class Animals:
a_type = "哺乳" def __init__(self, name, old):
self.name = name
self.old = old print(f"{name},{old}岁,是{self.a_type}动物") def info(self):
print(f"{self.name}是个{self.a_type}动物!") class Snack(Animals):
a_type = "冷血动物" def info(self):
Animals.info(self) # 在这呢!
print(f"我是{self.name}的父类重写") pass s = Snack("sheshe", 2) s.info()
sheshe,2岁,是冷血动物动物
sheshe是个冷血动物动物!
我是sheshe的父类重写
办法就是我先调用一下你父类的这个方法
然后我再继续写,这样就会先打印父类的,再打印你新加的东西
注意奥,要把self参数传进去
那好了,我又想起了他 --init--
我要是想再加个参数怎么做呢?
例如:
这是原先父类的(self, name, old)
我想在我的Snack里变成(self, name, old,sex)
怎么搞(直接加的是可以的,不用说了)
还是可以向上面一样,先调用父类,再继续
# -*- coding: utf-8 -*-
# @Time : 2019.07.16
# @Author : 爪爪
# @Url : https://www.cnblogs.com/jevious/ class Animals:
a_type = "哺乳" def __init__(self, name, old):
self.name = name
self.old = old print(f"{name},{old}岁,是{self.a_type}动物") def info(self):
print(f"{self.name}是个{self.a_type}动物!") class Snack(Animals):
a_type = "冷血动物" def __init__(self, name, old, sex):
Animals.__init__(self, name, old) # 看这里!!!
self.sex = sex def info(self):
Animals.info(self)
print(f"我是{self.name}的父类重写")
print(f"这是我的性别{self.sex}") pass s = Snack("sheshe", 2, "man") # 这里就要传三个参数 s.info()
sheshe,2岁,是冷血动物动物
sheshe是个冷血动物动物!
我是sheshe的父类重写
这是我的性别man
当然,你也会发现,这么写,稍微有点笨
所以在Py3中,我们可以用一个函数来解决这个问题!
super()(以前讲的,说面向对象再讲,有印象吧)
怎么用呢?
# -*- coding: utf-8 -*-
# @Time : 2019.07.16
# @Author : 爪爪
# @Url : https://www.cnblogs.com/jevious/ class Animals:
a_type = "哺乳" def __init__(self, name, old):
self.name = name
self.old = old print(f"{name},{old}岁,是{self.a_type}动物") def info(self):
print(f"{self.name}是个{self.a_type}动物!") class Snack(Animals):
a_type = "冷血动物" def __init__(self, name, old, sex):
# Animals.__init__(self, name, old) # 看这里!!!
super(Snack, self).__init__(name, old) # 看这里!!!
self.sex = sex def info(self):
Animals.info(self)
print(f"我是{self.name}的父类重写")
print(f"这是我的性别{self.sex}") pass s = Snack("sheshe", 2, "man") # 这里就要传三个参数 s.info()
super这里面啊应该写上你当前子类的名字(Snack)和 self
然后 . 一下,后面是你要修改的方法,去掉self,只留下形参
但是啊,这个人的记性啊,是真的差!怎么办呢?
程序猿就为了能更简单一点!
就有了如下的写法:
# -*- coding: utf-8 -*-
# @Time : 2019.07.16
# @Author : 爪爪
# @Url : https://www.cnblogs.com/jevious/ class Animals:
a_type = "哺乳" def __init__(self, name, old):
self.name = name
self.old = old print(f"{name},{old}岁,是{self.a_type}动物") def info(self):
print(f"{self.name}是个{self.a_type}动物!") class Snack(Animals):
a_type = "冷血动物" def __init__(self, name, old, sex):
# Animals.__init__(self, name, old) # 看这里!!!
# super(Snack, self).__init__(name, old) # 看这里!!!
super().__init__(name, old) # 看这里!
self.sex = sex def info(self):
Animals.info(self)
print(f"我是{self.name}的父类重写")
print(f"这是我的性别{self.sex}") pass s = Snack("sheshe", 2, "man") # 这里就要传三个参数 s.info()
更简单了是吧!
所以知道选哪个了吧!
别跟我说是不是只有--init--能用super
咋的啊?--init-- 多个啥啊?
不是函数啊!
这个函数都能用
别的函数凭啥不能用?
*这是单继承*
*多继承在后面*
~~核心编程(四):面向对象——单继承&复写~~的更多相关文章
- python面向对象单继承,多继承和super()调用
python 目录 python 1.继承 1.单继承 2.多继承 3.子类重写父类的同名属性和方法 核心点: 4.多层继承 5.super()的使用 1.继承 1.单继承 说明: 虽然子类没有定义_ ...
- Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)
Python进阶(十五)----面向对象之~继承 一丶面向对象的三大特性:封装,继承,多态 二丶什么是继承 # 什么是继承 # b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类 # ...
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
- 1.Java基础-面向对象编程思想(封装继承多态接口)
封装: 1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. 2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的 ...
- 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍
面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...
- (二)Javascript面向对象编程:构造函数的继承
Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承 ...
- C++知识点总结(四)——面向对象的编程细节总结
1.空类的默认函数 一般情况下,对于任意一个类A,如果程序员不显示的声明和定义上述函数,C++编译器将会自动的为A产生4个public inline(公有.内联)的默认函数,这4个函数最常见的形式为: ...
- day 27 网路编程 面向对象多继承
知识补充: 字符串转化为字节 string1 = input(“请输入你的名字”) string1.encode('utf-8') 字节转化为字符串 byte1 = b"alex" ...
- python之面向对象三大特性: 继承(单继承)
什么是继承 专业角度: B 继承 A类, B就叫做A的子类,派生类, A叫做B的父类,基类,超类. B类以及B类的对象使用A类的所有的属性以及方法. 字面意思: 继承就是继承父母所有的资产 class ...
随机推荐
- 一些常用的UI框架
MUI 挺好用的ui库,结合Hbuild更好用哦 WEUI 腾讯出品,和微信样式完美匹配 SUI Element UI 饿了么出品的桌面端ui框架 Mint-UI 饿了么针对移动端的ui框架 VUX ...
- Win8 Metro(C#)数字图像处理--2.37Wallis图象锐化
原文:Win8 Metro(C#)数字图像处理--2.37Wallis图象锐化 [函数名称] Wallis图象锐化 WallisSharpen(WriteableBitmap sr ...
- Win10《芒果TV》商店版更新v3.2.6:修复后台任务故障,优化推送频次
2017湖南卫视大型音乐竞技节目<歌手>,2017年1月21日晚首播第一期,7位歌手惊艳亮嗓,<芒果TV>UWP版迅速更新v3.2.6版,主要是修复后台任务故障,优化推送频次, ...
- 微信小程序把玩(三)tabBar底部导航
原文:微信小程序把玩(三)tabBar底部导航 tabBar相对而言用的还是比较多的,但是用起来并没有难,在app.json中配置下tabBar即可,注意tabBar至少需要两个最多五个Item选项 ...
- /\B(?=(?:\d{3})+$)/g 一条令人费解的正则表达式
网上浏览博客看到要用JavaScript正则表达式解决一个功能, 要在数字中间插入逗号, 用来表示书面的金额写法. JS代码是这样子的 let test1 = '1234567890' let for ...
- Android签名打包
生成正式的签名APK文件 1.使用AndroidStudio生成: 点击导航栏上的Build-->Generate Signed APK,弹出创建签名APK对话框(首次点击可能会提示输入操作系统 ...
- Another maybe monad library for ruby
欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingyang 项目地址:https://github.com/liangjingyang/maybe_ ...
- 腾讯网移动端H5页面设计实战分享
分享 <关于我> 分享 [中文纪录片]互联网时代 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...
- XML转义字符 如"&"
解析数据 XML 解析器通常情况下会处理XML文档中的所有文本. 当XML元素被解析的时候,XML元素内部的文本也会被解析,例如: <message>Hello Word!</mes ...
- javaweb各种框架组合案例(三):maven+spring+springMVC+hibernate
1.hibernate译为"越冬",指的是给java程序员带来春天,因为java程序员无需再关心各种sql了: 2.hibernate通过java类生成数据库表,通过操作对象来映射 ...