面向对象中的继承问题,研究了一天 ,简单梳理下其中最重要的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的更多相关文章

  1. 【转载】 C++多继承中重写不同基类中相同原型的虚函数

    本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: ...

  2. python 继承中的super

    python继承中子类访问父类的方法(包括__init__)主要有两种方法,一种是调用父类的未绑定方法,另一种是使用super(仅仅对于新式类),看下面的两个例子: #coding:utf-8 cla ...

  3. 一个Public的字段引起的,谈谈继承中的new

    一直觉得对c#面向对象这块已经掌握的很好了,因为正常情况下字段一般我们设计成私有的,今天突然想到一个实验,如下有两个很简单的类: public class Farther { ; public vir ...

  4. Android(java)学习笔记119:继承中父类没有无参构造

    /* 如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢? 报错. 如何解决呢? A:在父类中加一个无参构造方法 B:通过使用super关键字去显示的调用父类的带参构造方法 C:子类通过th ...

  5. [Java] 继承中,父类被覆盖的成员变量、方法的可访问性

    在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. ...

  6. C++类继承中的构造函数和析构函数 调用顺序

    思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...

  7. java学习笔记-继承中super关键字

    背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...

  8. Swift难点-继承中的构造规则实例具体解释

    关于继承中的构造规则是一个难点. 假设有问题,请留言问我. 我的Swift新手教程专栏 http://blog.csdn.net/column/details/swfitexperience.html ...

  9. JAVA 继承中的this和super

    学习java时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...

随机推荐

  1. tx-Lcn 分布式事务

    测试内容 SpringCloud 微服务,有两个服务,从资料服务调度到文件服务,优先在文件服务那边 save 文件后,然后拿到 fileId 存储在资料服务中.两者之间的调用使用 feign.这期间涉 ...

  2. Linux网络服务第四章部署yum仓库

    第四章部署yum仓库服务 1.笔记 systemctl start 命令 :重启 systemctl enable 命令 :开机自启动 netstat -anput | grep 命令:查看是否开启 ...

  3. Golang Context 的原理与实战

    本文让我们一起来学习 golang Context 的使用和标准库中的Context的实现. golang context 包 一开始只是 Google 内部使用的一个 Golang 包,在 Gola ...

  4. Codeforces Round 623(Div. 2,based on VK Cup 2019-2020 - Elimination Round,Engine)D. Recommendations

    VK news recommendation system daily selects interesting publications of one of n disjoint categories ...

  5. CodeForces - 1058D D. Vasya and Triangle

    D. Vasya and Triangle time limit per test1 second memory limit per test256 megabytes inputstandard i ...

  6. CodeForces 1058C C. Vasya and Golden Ticket

    C. Vasya and Golden Ticket time limit per test1 second memory limit per test256 megabytes inputstand ...

  7. RF(用例执行方法)

    一.执行 RF 脚本方法 1.执行整个项目下的所有用例 dos 窗口下输入 robot + 项目绝对路径 2.执行单个 Suite 中的所有用例 dos 窗口下输入 robot + 用例套件绝对路径 ...

  8. C语言程序设计实验报告(第一次实验)

    C程序设计实验报告 实验项目:C语言程序设计教程实验1.3.2:1.3.3:1.3.4:2.3.1:2.3.2 姓名:赖瑾 实验地点:家 实验时间:2020.2.25 目录 C程序设计实验报告 一.实 ...

  9. 【T-SQL】基础 —— 语法(1)

    USE master--检查是否已经存在一个表,如果有就删除IF(EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ' ...

  10. 遍历HashMap常用的的三种方式

    遍历HashMap常用的的三种方式 HashMap是我们使用非常多的集合之一,下面就来介绍几种常用的HashMap的遍历方式. 1.首先定义一个新的HashMap,并往里面添加一些数据. HashMa ...