- 视频、源码、课件、软件、笔记:超全面Python基础入门教程【十天课程】博客笔记汇总表【黑马程序员】
Python基础day09【面向对象(封装、继承、多态)、重写、私有权限】
Python基础day09 作业解析【面向对象题目(简答题+代码题)】
Python基础day09【试题讲解《python基础中期考试》】
目录
简答题
代码题
题目1 [加强训练]
题干
训练目标
训练提示
参考方案
操作步骤
参考答案
题目2 [加强训练]
题干
训练目标
训练提示
参考方案
操作步骤
参考答案
题目3 [综合训练]
题干
训练目标
训练提示
参考方案
操作步骤
参考答案
题目4 [综合训练]
题干
训练目标
训练提示
参考方案
操作步骤
参考答案
题目5 [综合训练]
题干
训练目标
训练提示
参考方案
操作步骤
参考答案
题目 6[综合训练]
题干
参考答案
1.请写出单继承的格式?
class 子类名(父类名):
pass
2.什么是重写?为什么要重写?
重写:子类实现父类中的同名方法。
为什么要重写:父类中的方法不能满足子类对象的需求。
3.如何将一个属性变为私有的?
在属性名前加上两个下划线。
4.定义类方法的语法格式?
# 使用@classmethod 装饰的方法,是类方法
class MyClass(object):
@classmethod
def func(cls):
pass
5.定义静态方法的语法格式?
# 使用@staticmethod装饰的方法,是静态方法
class MyClass(object):
@staticmethod
def func():
pass
6.请判断下面类中,哪些是类属性,哪些是实例属性?
class Car(obj):
addr = "china"
def __init__(self):
self.name = 'changcheng'
self.money = 100000答案:
addr:类属性
self.name:实例属性
self.money:实例属性
7.判断题
- a.一个子类可以继承多个父类 # 正确
- b.类中的方法可以有return,也可以没有return # 正确
- c.类方法和静态方法是一样的 # 错误
- d.删除对象时,默认调用 __init__ 方法 # 错误,创建对象调用__init__ 方法,删除对象调用 __del__ 方法
- e.python3中object是所有类的父类 # 正确
- f.python中不支持多继承 # 错误
- g.父类中的所有方法和属性都会被继承 # 错误私有方法和属性不会继承
- h.一个对象可以当做一个参数来传递 # 正确
- i.如果类属性和实例属性名字相同,那么实例对象调用时候使用的是类属性 # 错误,实例对象,调用的是实例属性
- j.实例对象不可以访问类属性 # 错误
- k.重写方法后,父类对象默认调用重写后的方法 # 错误,子类调用重写后的方法,父类调用父类自己的方法
- l.类方法不可以通过实例对象来调用,只能通过类对象调用 # 错误
- m.一个类只能创建一个对象 # 错误
创建一个Animal(动物)基类,其中有一个run方法,输出
跑起来....
创建一个Horse(马)类继承于动物类,Horse类中不仅有run方法还有eat方法
run方法输出
跑起来....
eat 方法输出
吃东西...
单继承的使用
继承的语法格式是什么?
继承有什么特点?
子类中增加父类中没有的方法
继承的语法格式如下:
class 子类(父类):
pass继承的特点:子类继承父类之后,子类对象可以使用父类的属性和方法,即会将父类中的属性和方法继承
定义一个Animal(动物)类,实现run方法
定义子类Horse(马)继承父类,实现eat方法
class Animal(object): def run(self): print("跑起来...") class Horse(Animal): def eat(self): print("吃东西...")
创建一个动物(Animal)的基类,其中有一个run方法, 输出
跑起来....
创建一个Horse(马)类继承于动物类,Horse类中重写run方法,增加打印输出"迈着矫健的步伐跑起来",同时实现eat方法, 输出
吃东西...
子类重写父类中的方法
子类调用父类中的方法
如何重写父类方法?
如何在子类中调用父类的方法?
定义父类
子类继承父类
重写父类方法
调用父类方法
创建父类
创建子类
重写父类方法
使用super方法调用父类方法
class Animal(object): def run(self): print("跑起来...") class Horse(Animal): def run(self): # 调用父类中的 run 方法, # super(Horse, self).run() # 方法一 Animal.run(self) # 方法二 print("迈着矫健的步伐跑起来") def eat(self): print("吃东西") c = Horse() c.run() c.eat()
创建一个动物(Animal)的基类,其中有一个run方法, 输出
跑起来....
创建一个Horse(马)类继承于动物类,Horse类中不仅有run方法还有eat方法
run方法输出
跑起来....
eat 方法输出
吃东西...
创建一个 SwiftHorse(千里马)类继承Horse类,初始化init方法name属性为千里马
多层继承
Horse 继承 Animal
SwiftHorse 继承 Horse
SwiftHorse类都拥有那些属性和方法?
定义Animal类
定义Horse类继承Animal类
定义SwiftHorse类继承Horse类
class Animal(object): def run(self): print("跑起来...") class Horse(Animal): def eat(self): print("吃东西...") class SwiftHorse(Horse): def __init__(self): self.name = "千里马"
创建一个动物(Animal)的基类,其中有一个run方法, 输出
跑起来....
创建一个Horse(马)类继承于动物类,Horse类中不仅有run方法还有eat方法
run方法输出
跑起来....
eat 方法输出
马吃东西...
创建一个Donkey(驴)类继承于动物类,Donkey类中不仅有run方法还有eat方法
run方法输出
跑起来....
eat 方法输出
驴吃东西...
创建一个Mule(骡子)类继承于Horse,Donkey,初始化name为 骡子。 问题: 创建 Mule 类的对象, 调用 eat 方法,调用的是哪个父类中的方法?
多继承
多继承,当使用super时调用的是哪个父类的方法?
使用super() 是否调用所有的父类方法?只执行多少次。调用顺序遵循什么顺序。
如果继承了多个父类,且父类都有同名方法,则默认只执行第一个父类的(同名方法只执行一次,目前super()不支持执行多个父类的同名方法)
使用super() 可以逐一调用所有的父类方法,并且只执行一次。调用顺序遵循 mro 类属性的顺序。
定义Horse类
定义Donkey类
定义Mule类,继承Horse、Donkey。
class Animal(object): def run(self): print("跑起来...") class Horse(Animal): def eat(self): print("马吃东西...") class Donkey(Animal): def eat(self): print("驴吃东西...") class Mule(Horse, Donkey): def __init__(self): self.name = "骡子" # 创建 Mule 类对象 mule = Mule() # 调用同名方法,是第一个父类中的方法 mule.eat()
创建一个动物类(Animal),其中有一个run方法
创建一个Cat类继承于动物类,具有私有属性__name = "波斯猫"
创建一个Dog类继承于动物类,具有私有属性__name = "京巴狗"
Cat类中不仅有run方法还有eat方法
Dog类中方法同上
创建一个letRun函数,可以接收动物及其子类对象,并调用run方法 class Cat(Animal):
编写测试代码以验证功能正常
多态的使用
私有属性的使用
多态的使用地点
函数接收的参数可以为一个对象
定义一个函数,接收一个类的对象
创建出的对象传入到方法中
在方法中调用对应的方法
创建一个动物的基类,其中有一个run方法
创建一个Cat类继承于动物类
创建一个Dog类继承于动物类
cat和dog中创建属性和方法
创建一个letRun函数,可以接收动物及其子类对象,并调用run方法
创建不同的对象,分别传入到letRun函数中,测试结果
# 1.创建一个动物的基类,其中有一个run方法 class Animal(object): def run(self): print('跑起来') # 2.创建一个Cat类继承于动物类 class Cat(Animal): # 4.Cat类中不仅有run方法还有eat方法 def __init__(self): self.__name = "波斯猫" def run(self): print('%s在跑' % self.__name) def eat(self): print('%s在吃' % self.__name) # 3.创建一个Dog类继承于动物类 class Dog(Animal): # 5.方法同上 def __init__(self): self.__name = "京巴狗" def run(self): print('%s在跑' % self.__name) def eat(self): print('%s在吃' % self.__name) # 6.创建一个letRun函数,可以接收动物及其子类对象,并调用run方法 class Cat(Animal): def letRun(animal): animal.run() # 7.编写测试代码以验证功能正常 # 动物测试 animal = Animal() letRun(animal) # 猫测试 cat = Cat() letRun(cat) cat.eat() # 狗测试 dog = Dog() letRun(dog) dog.eat()
定义一个
Person
类,包含初始化 init 方法:实例属性: 名字name、年龄age
记录由该类创建的对象的个数,创建一个对象,计数+1, 删除一个对象,计数减一
定义一个方法,可以打印当前对象的个数
定义一个方法
show_info
,输出以下信息:这是一个Person类,谢谢查看!打印对象的时候,可以输出打印自己的名字和年龄:我的名字是xxx,年龄是xxx。
定义一个方法
study
,输出以下信息:我叫xxx,我要好好学习。操作步骤
调用
show_info
方法;创建两个对象,打印当前对象,并打印当前的对象个数;
分别使用两个对象调用
study
方法;删除一个对象,打印输出当前的对象个数。
class Person(object): # 定义类属性,count,统计该类创建的对象的个数 __count = 0 # 定义 init 方法,创建实例属性 def __init__(self, name, age): self.name = name self.age = age Person.__count += 1 # 定义类方法,打印当前对象的个数 @classmethod def get_count(cls): return cls.__count # 定义静态方法,show_info @staticmethod def show_info(): print('这是一个 Person 类,谢谢查看!') # 定义 str 方法 def __str__(self): return f"姓名:{self.name}, 年龄:{self.age}" # 定义 study 方法 def study(self): print(f"我叫 {self.name}, 我要好好学习") # 定义__del__方法 def __del__(self): Person.__count -= 1 # 调用 show_info 方法 Person.show_info() print(Person.get_count()) xw = Person('小王', 18) print(xw, xw.get_count()) xh = Person('小红', 18) print(xh, xh.get_count()) xw.study() xh.study() del xw print(Person.get_count())