梳理继承中的has a和is a
面向对象中的继承问题,研究了一天 ,简单梳理下其中最重要的has a和is a
1、has a
一个类中使用了另一个类中的自定义的类型
这里Student中使用了Book 和 computer
2、类型
系统类型
str int float list dict tuple set
自定义类型
通过自定义的方式定义的类型这里的book,computer,student都是自定义类型
通过类的定义产生的对象在解释器中就跟系统定义的一样 也就是这里类型生成的对象,com book1 student1,
在解释器中就是一个类似于 123 int类型或者[123] 列表类型的对象
1、 is a
在这里,无论是student类还是worker类都直接继承了父类(基类)person中的相关属性
这种继承时is a 类型
一种对象的所有属性都被另一个全盘继承,是父与子的关系
注意:
1、父类中所有属性,方法,子类可以直接调用
2、子类在初始化属性时需要用 super__init__()添加需要继承的共有熟悉
3、私有属性可以再通过self.XXX的方式添加
4、如果父类中和子类中有相同的方法(函数),先调用当前类,就是重写(覆盖)
5、子类方法中也可以通过super.方法名 调用父类中的方法
#has a
# 定义类
class Computer:
def __init__(self, brand, size, color):
self.brand = brand
self.size = size
self.color = color def online(self):
print('正在用{}电脑上网'.format(self.brand)) def __str__(self):
return '品牌{};尺寸{};颜色{}'.format(self.brand, self.size, self.color) class Book:
def __init__(self, name, author, number):
self.name = name
self.author = author
self.number = number def __str__(self):
return "书名{};作者{};数量{}".format(self.name, self.author, self.number) class Student:
def __init__(self, name, computer, book):
self.name = name
self.computer = computer
self.books = []
self.books.append(book) # 这里的调用和循环还是不甚清楚
def borrow_book(self, book):
# 遍历书单book,
for bro_book in self.books:
# 判断是否重复
if bro_book.name == book.name:
print('已拥有这本书,不用再借')
break
else: # 遍历完成,没有结果之后将传的对象添加到书单books中
self.books.append(book)
print('借书成功') def show_books(self):
for book in self.books:
print(book) def __str__(self):
return '姓名{};电脑情况{};书籍情况{}'.format(self.name, self.computer, self.books) # 创建对象
com = Computer('hua wei', '', '银白')
book1 = Book('盗墓笔记', '南派三叔', '')
stu = Student('许诺', com, book1)
print(stu)
print(stu.books)
stu.show_books() # 借书操作
book2 = Book('鬼吹灯', '不知道', '')
stu.borrow_book(book2)
stu.show_books()
# is a
class Person: def __init__(self, name, age):
self.name = name
self.age = age def eat(self):
print('{}正在吃饭'.format(self.name)) def run(self):
print('{}正在跑步'.format(self.name)) class Student(Person): def __init__(self, name, age, clazz): # 初始化对象属性
super().__init__(name, age) # 通过继承的方式从父类中取得共有属性
self.clazz = clazz # 定义自己独有属性 def eat(self): # 如果父类中和子类中有相同的方法(函数),先调用当前类,就是重写(覆盖)
# super().eat() # 这里如果需要也可以通过这种方式调用父类中的方法
print('{}正在吃饭,子类中的函数eat'.format(self.name)) def __str__(self):
return "学生对象{},年龄{}岁,班级{},创建完成".format(self.name, self.age, self.clazz) class Worker(Person): def __init__(self, name, age, salary, manager):
super().__init__(name, age)
self.salary = salary
self.manager = manager def __str__(self):
return "员工对象{},年龄{}岁,薪资{},领导{},创建完成".format(self.name, self.age, self.salary, self.manager) # 创建对象
s = Student('许诺', 24, '20-05')
# 查看对象详细属性,自动执行该对象内部str函数下内容
print(s)
# 可以通过.XXX的方式调用父类中的函数
s.run()
s.eat() w = Worker('小徐', 28, 1000, '傻缺')
print(w)
w.run()
w.eat()
梳理继承中的has a和is a的更多相关文章
- 【转载】 C++多继承中重写不同基类中相同原型的虚函数
本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...
- python 继承中的super
python继承中子类访问父类的方法(包括__init__)主要有两种方法,一种是调用父类的未绑定方法,另一种是使用super(仅仅对于新式类),看下面的两个例子: #coding:utf-8 cla ...
- 一个Public的字段引起的,谈谈继承中的new
一直觉得对c#面向对象这块已经掌握的很好了,因为正常情况下字段一般我们设计成私有的,今天突然想到一个实验,如下有两个很简单的类: public class Farther { ; public vir ...
- Android(java)学习笔记119:继承中父类没有无参构造
/* 如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢? 报错. 如何解决呢? A:在父类中加一个无参构造方法 B:通过使用super关键字去显示的调用父类的带参构造方法 C:子类通过th ...
- [Java] 继承中,父类被覆盖的成员变量、方法的可访问性
在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. ...
- C++类继承中的构造函数和析构函数 调用顺序
思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...
- java学习笔记-继承中super关键字
背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...
- Swift难点-继承中的构造规则实例具体解释
关于继承中的构造规则是一个难点. 假设有问题,请留言问我. 我的Swift新手教程专栏 http://blog.csdn.net/column/details/swfitexperience.html ...
- JAVA 继承中的this和super
学习java时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...
随机推荐
- Python执行Linux cmd命令,获取输出的一种方法,输出是bytes
import subprocess p = subprocess.Popen('df -lh', stdout=subprocess.PIPE, shell=True) print(p.stdout. ...
- Inno Script - How to make “I Accept the Agreement” radio button on EULA page selected by Default
出处: https://stackoverflow.com/questions/11187022/inno-script-how-to-make-i-accept-the-agreement-radi ...
- JDK14的新特性:Lombok的终结者record
目录 简介 新的Record类型 探讨Record的秘密 record扩展 总结 JDK 14的新特性:Lombok的终结者record 简介 自从面向对象产生之后,程序界就开始了新的变化,先是C发展 ...
- mybatis 批量保存,并且唯一约束
1.主键返回在insert配置中添加两个属性 useGeneratedKeys="true" keyProperty="id" 2.唯一约束冲突可以使用 ON ...
- IDEA 之 ERROR:端口被占用
问题描述:在IDEA启动javaweb项目中未能成功启动,ERROR:端口已经被使用.但是tomcat并没有被启动. 解决方法: 打开CMD 输入以下命令 netstat -aon | finfstr ...
- 【JAVA基础】07 面向对象2
1. 代码块的概述和分类 面试的时候会问,开发不用或者很少用 代码块概述 在Java中,使用 {} 括起来的代码被称为代码块. 代码块分类 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态 ...
- Firefox 66 发布,阻止网站自动播放声音
Firefox 66 发布了,此版本在桌面版中带来的新特性包括: Firefox 现在阻止网站自动播放声音,如果需要可以单独调整 改进的搜索体验: 当打开许多选项卡时,可以更快地查找特定网页:现在可以 ...
- TEC-004-php文件下载任意文件读取漏洞修复
修改download?u参数值,将/public/files/14842030529.txt,替换为../../../../../../../../../../etc/passwd functi ...
- GPTL—练习集—006树的遍历
#include<bits/stdc++.h> using namespace std; typedef int daTp;//datatype typedef struct BTNode ...
- iOS自定义tabBar
在我们的项目中经常会自己自定义tabBar因为苹果自带的真的太丑了!也不满足我们的项目需求. 好 开始行动吧! 先上图看下我们最终实现的效果: 继承UItabBar自定义一个自己的tabBar .h# ...