面向对象案例:封装、继承、多态
1 需求
定义三个类, 小狗, 小猫, 人
小狗: 姓名, 年龄(默认1岁); 吃饭, 玩, 睡觉, 看家(格式: 名字是xx, 年龄xx岁的小狗在xx)
小猫: 姓名, 年龄(默认1岁); 吃饭, 玩, 睡觉, 捉老鼠(格式: 名字是xx, 年龄xx岁的小猫在xx)
人: 姓名, 年龄(默认1岁), 宠物; 吃饭, 玩, 睡觉(格式: 名字是xx, 年龄xx岁的人在xx)
养宠物(让所有的宠物吃饭, 玩, 睡觉),
让宠物工作(让所有的宠物根据自己的职责开始工作)
2 思考点
封装
- 将一些属性和相关方法封装在一个对象中,即对象的抽取
- 类定义,class
- 给类添加,类属性还是实例属性的判断
- 使用实例属性时,是创建实例后添加,还是通过初始化方法添加
- 通过初试化方法传参添加实例属性时,注意默认值参数写法及其位置
- 实例方法的定义
- 格式化打印的方式,字符串 format 或者格式符替换形式
- __str__内置方法对 self 的描述使用
继承
- 多个类之间,共有有属性和方法抽取,抽象出共有父类
- 通过 super 方式调用父类初始化方法,子类初始化中传参个数和位置问题
- super调用父类初始化方法的方式
super().__init__()
,super(Person, self).__init__()
,; - 父类中的
__init__()
方法内没有默认值的参数,当子类通过 super 调用时,需写上父类没有默认值的参数
多态
- 相似方法优化成名称相同,方便统一调用
- 子类调用父类的方法
可进一步优化点
class Animal:
def __init__(self, name, age=1):
self.name = name
self.age = age
def eat(self):
print("%s,在吃饭" % self)
def play(self):
print("%s,在玩" % self)
def sleep(self):
print("%s,在睡觉" % self)
class Person(Animal):
def __init__(self, name, pets, age):
super().__init__(name, age)
self.pets = pets
def yang_pets(self):
for pet in self.pets:
pet.eat()
pet.play()
pet.sleep()
def make_pets_word(self):
for pet in self.pets:
pet.work()
def __str__(self):
return "名字叫{},年龄是{}的人".format(self.name, self.age)
class Dog(Animal):
def work(self):
print("小狗在看家")
def __str__(self):
return "名字叫{},年龄是{}的小狗".format(self.name, self.age)
class Cat(Animal):
def work(self):
print("小猫在抓老鼠")
def __str__(self):
return "名字叫{},年龄是{}的小猫".format(self.name, self.age)
d = Dog("小Dog", 3)
c = Cat("小Cat", 4)
p = Person("JJ",[d, c], 20)
p.eat()
p.play()
p.sleep()
p.yang_pets()
p.make_pets_word()
>>>>打印结果
名字叫JJ,年龄是20的人,在吃饭
名字叫JJ,年龄是20的人,在玩
名字叫JJ,年龄是20的人,在睡觉
名字叫小Dog,年龄是3的小狗,在吃饭
名字叫小Dog,年龄是3的小狗,在玩
名字叫小Dog,年龄是3的小狗,在睡觉
名字叫小Cat,年龄是4的小猫,在吃饭
名字叫小Cat,年龄是4的小猫,在玩
名字叫小Cat,年龄是4的小猫,在睡觉
小狗在看家
小猫在抓老鼠
网友评论