梳理继承中的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时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...
随机推荐
- Spring Boot filter
在Spring Boot中自定义filter 本文我们将会讲解如何在Spring Boot中自定义filter并指定执行顺序. 定义Filter很简单,我们只需要实现Filter接口即可,同时我们可指 ...
- Linux Centos7(Mac)安装Docker
docker 强调隔离性 docker:官网 docker:镜像官网: 镜像官网可以所有应用,选择安装环境:会给出安装命令,例如:docker pull redis 默认拉取最新的版本( ...
- javescrip内嵌样式与外联样式怎么做?
对于前端初学者,个人JS样式常用的有两种:内嵌样式 ,外联样式:下面通过一个简单的鼠标点击出现设定的验证数字为例进行演示: 先看下效果: 鼠标点击前效果: 鼠标点击后效果: 图中的这个ojbk是我js ...
- 解决Vue-cli3.0下scss文件编译过慢、卡顿问题
在使用Vue-cli 3.0构建的项目中,可能存在项目编译过慢的问题,具体表现在编译时会在某一进度比如40%时停顿,等好一会儿才能够编译完成.这使得浏览器中的实时预览也会卡顿,不利于我们快速查看效果, ...
- Spark学习笔记(一)
概念: Spark是加州大学伯克利分校AMP实验室,开发的通用内存并行计算框架. 支持用scala.java和Python等语言编写应用程序.相较于Hdoop,往往有更好的运行效率. Spark包括了 ...
- 【阅读笔记】Ranking Relevance in Yahoo Search (四 / 完结篇)—— recency-sensitive ranking
7. RECENCY-SENSITIVE RANKING 作用: 为recency-sensitive的query提高排序质量: 对于这类query,用户不仅要相关的还需要最新的信息: 方法:rece ...
- Linked List-2
三.编码技巧 1.遍历链表 先将head指针赋值给一个局部变量current: //return the number of nodes in a list (while-loop version) ...
- Algorithm Exercises
汇总一些常见的算法题目,参考代码. 注:部分题目没有合适的oj地址 枚举 Perfect Cubes.Biorhythms.Counterfeit Dollar.EXTENDED LIGHTS OUT ...
- RF(数据库测试)
1.下载 DatabaseLibrary 库 pip install robotframework-databaselibrary 2.下载 pymysql 库(作为中间件) pip install ...
- swipe 滑动操作
1.swipe() 滑动用法 swipe(self, start_x, start_y, end_x, end_y, duration=None) :Args: - start_x - 开始滑动的x坐 ...