梳理继承中的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', '14', '银白') book1 = Book('盗墓笔记', '南派三叔', '10') stu = Student('许诺', com, book1) print(stu) print(stu.books) stu.show_books() # 借书操作 book2 = Book('鬼吹灯', '不知道', '8') 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()

 



posted @ 2020-05-21 02:48  许诺1994  阅读(703)  评论(0)    收藏  举报