梳理继承中的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时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...
随机推荐
- ansible的剧本play(四)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA68AAAETCAYAAADZDzDOAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw
- qemu-img 整理
qemu-img命令语法: qemu-img command [command options] check命令: check [-f fmt < qcow2 | qed | vdi >] ...
- MYSQL 排序和分组
一.MYSQL 中有两种排序方式: 1:通过有序索引顺序扫描直接返回有序数据,这种方式在使用explain 分析查询的时候显示为Using Index ,不需要额外的排序,操作效率较高. 2: 是通过 ...
- Notations
下面四种记号是为了建立函数间的相对级别. CLRS上的一张图很直观: 大O记号 定义:如果存在正常数\(c\)和\(n_0\),使得当\(N\ge n_o\)时\(T(N)\le cf(N)\),记\ ...
- codeforce 1311 D. Three Integers
In one move, you can add +1 or −1 to any of these integers (i.e. increase or decrease any number by ...
- CodeForces - 1102B Array K-Coloring
B. Array K-Coloring time limit per test2 seconds memory limit per test256 megabytes inputstandard in ...
- POJ1088 滑雪题解+HDU 1078(记忆化搜索DP)
Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- 7) 项目准备流程 和 django权限六表
一.项目准备 1. 创建django项目 2. 创建数据库 —— init文件中声明mysql —— settings中配置数据库 import pymysql pymysql.install_as_ ...
- MySQL 中 on与where筛选条件的区别
在两张表连接的时候才会有on的筛选条件,那么on和where的区别是什么呢? 在inner join中是没有区别的,但是在左连接和右连接中,区别就体现出来了,下面以左连接为例: 1.用on的时候,只对 ...
- 【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?
写在前面 这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备 ...