day19-继承与内存管理及作业
1.什么是继承
"""
继承是让子类直接拥有父类的属性和方法的过程就是继承
子类 - 继承者
父类 - 被继承者
"""
2.怎么继承
"""
class 子类(父类1,父类2,..)
类的说明文档
类的内容
说明;
默认情况下,类继承自object:
class 类名: == class 类名(object):
"""
class Person:
num = 61
def __init__(self,name='张三',age=18):
self.name = name
self.age = age
self.__id = '001'
def eat(self,food='馒头'):
print(f'{self.name}在吃{food}')
@staticmethod
def func1():
print('静态')
class Student(Person):
pass
# 3.继承可以让子类直接拥有父类所有的属性和方法
stu1 = Student('小红')
print(Student.num)
print(stu1.name)
print(stu1.age)
stu1.eat('肉包子')
Student.func1()
print(stu1.__dict__)
3.继承
"""
1.添加类属性和方法
直接在子类中定义
2.添加对象属性
需要在子类__init__方法中通过super()去调用父类的__init__方法
注意:super()只能在对象方法和类方法中使用,静态方法中不能使用super()
"""
class Animal:
num = 44
def __init__(self,name='张三'):
self.name = name
def eat(self):
print('吃')
def func(self):
print('abc')
class Cat(Animal):
# 添加字段
x='abc'
num = 55
# 添加方法
def play(self):
print('猫在玩')
# 重写
def eat(self):
print('猫在吃鱼')
# 添加对象属性
def __init__(self):
# super.父类的方法
super().__init__() # 调用父类__init__() 方法
self.height = 12
def func(self):
super().func()
print('====')
cat = Cat()
print(Cat.num)
print(Cat.x)
cat.play()
cat.eat()
print(cat.height)
print(cat.name)
cat.func()
# 练习:定义一个教师类在Person类的基础上添加:职称和工龄两个属性,
# 并且要求创建教师对象的时候必须给名字、职称和性别赋值,年龄和工龄可以赋值可以不赋值
class Person:
def __init__(self, name, age=0, gender='男'):
self.name = name
self.age = age
self.gender = gender
class Teacher(Person):
def __init__(self,name,staff,gender,age=18,working_age=1):
super().__init__(name,age,gender)
self.staff = staff
self.working_age = working_age
t1 = Teacher('小明','讲师','男')
print(t1.staff)
5.内存管理
# 内存管理
"""
定义变量保存数据的时候,系统会自动在内存空间保存数据(空间的大小根据数据的大小确定)
默认情况下,使用的数据如果之前保存过,还是会重新申请新的内存保存这个数据,但是数字和字符串除外
一个数据是否需要释放就看这个数据引用计数是否为0(没有引用)
不为0(有引用)数据不会销毁,为0数据会自动销毁
"""
作业
-
建立一个汽车类Auto,包括轮胎个数,汽车颜色,车身重量,速度等属性,并通过不同的构造方法创建实例。至少要求 汽车能够加速 减速 停车。 再定义一个小汽车类CarAuto 继承Auto 并添加空调、CD属性,并且重新实现方法覆盖加速、减速的方法
class Auto(object): def __init__(self,tyre_num=4,color='black',weight=1.4,speed=0): self.tyre_num =tyre_num self.color =color self.weight =weight self.speed =speed # 加速 def speed_up(self,speed_num=None): if speed_num: self.speed += speed_num print(f'当前车速为:{self.speed}') else: print('没有加速') # 减速 def slow_down(self,speed_num=None): if speed_num: self.speed -= speed_num print(f'当前速度为:{self.speed}') else: print(f'当前速度为:{self.speed}') # 停车速度为0 def stop(self): self.speed = 0 print(f'当前车速为:{self.speed}') auto = Auto() auto.speed_up(10) auto.slow_down(20) auto.stop() print('---------------------------------------------') class CarAuto(Auto): def __init__(self,air='格力',CD='cd'): super().__init__() self.air = air self.CD = CD def speed_up(self): print('我是加速重写') def slow_down(self): print('我是减速重写') car = CarAuto(2.0) car.speed_up() print(car.weight)
-
创建一个Person类,添加一个类字段用来统计Perosn类的对象的个数
class Person: count = 0 def __init__(self): Person.count +=1 per = Person() per1 = Person() per2 = Person() print(Person.count) # 3
-
创建一个动物类,拥有属性:性别、年龄、颜色、类型 ,
要求打印这个类的对象的时候以’/XXX的对象: 性别-? 年龄-? 颜色-? 类型-?/’ 的形式来打印
class Animal: def __init__(self, gender='母', age=2, color='gray', animal_class='波斯猫'): self.gender = gender self.age = age self.color = color self.animal_class = animal_class def __repr__(self): return f'/{self.__class__.__name__}:的对象,性别:{self.gender}, 年龄:{self.age}, 颜色:{self.color}, 类型:{self.animal_class}/' a1 = Animal() print(a1) # /Animal:的对象,性别:母, 年龄:2, 颜色:gray, 类型:波斯猫/
-
写一个圆类, 拥有属性半径、面积和周长;要求获取面积和周长的时候的时候可以根据半径的值把对应的值取到。但是给面积和周长赋值的时候,程序直接崩溃,并且提示改属性不能赋值
class Circle: pi = 3.14 def __init__(self, radius=2, area=None, perimeter=None): self.radius = radius self._area = area self._perimeter = perimeter @property def perimeter(self): return self.radius * 2 * Circle.pi @property def area(self): return Circle.pi * self.radius**2 @perimeter.setter def perimeter(self,value): print(f'该属性:不能赋值!') raise ValueError @area.setter def area(self,value): print(f'该属性:不能赋值!') raise ValueError c1 = Circle(4) print(c1.area) print(c1.perimeter)
-
写一个扑克类, 要求拥有发牌和洗牌的功能(具体的属性和其他功能自己根据实际情况发挥)
import random class Poker: colors = ['♥', '♠', '♣', '♦'] nums = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] cards = ['JOCKER', 'jocker'] def __init__(self,hit=None): self._hit = hit @property def hit(self): for num in Poker.nums: for color in Poker.colors: Poker.cards.append(color + num) return Poker.cards # 洗牌 def shu(self): random.shuffle(Poker.cards) return Poker.cards # 发牌 def deal(self): user1 = [] user2 = [] user3 = [] iter1 = iter(Poker.cards) for x in range(17): user1.append(next(iter1)) user2.append(next(iter1)) user3.append(next(iter1)) def func(item): num = item[1:] date = { 'J':11, 'Q':12, 'K':13, 'A':14, '2':15, 'OCKER':16, 'ocker':17 } if '3'<=num<='9'or num == '10': return int(num) return date[num] user1.sort(key=func,reverse=True) return f'user1:{user1}\nuser2:{user2}\nuser3:{user3}\n底牌:{list(iter1)}' p1 = Poker() print(p1.hit) print(p1.shu()) print(p1.deal())
-
(尝试)写一个类,其功能是:1.解析指定的歌词文件的内容 2.按时间显示歌词 提示:歌词文件的内容一般是按下面的格式进行存储的。歌词前面对应的是时间,在对应的时间点可以显示对应的歌词
[00:00.20]蓝莲花 [00:00.80]没有什么能够阻挡 [00:06.53]你对自由地向往 [00:11.59]天马行空的生涯 [00:16.53]你的心了无牵挂 [02:11.27][01:50.22][00:21.95]穿过幽暗地岁月 [02:16.51][01:55.46][00:26.83]也曾感到彷徨 [02:21.81][02:00.60][00:32.30]当你低头地瞬间 [02:26.79][02:05.72][00:37.16]才发觉脚下的路 [02:32.17][00:42.69]心中那自由地世界 [02:37.20][00:47.58]如此的清澈高远 [02:42.32][00:52.72]盛开着永不凋零 [02:47.83][00:57.47]蓝莲花
import re import time class Parser: def __init__(self,content=None): self._content = content @property def content(self): with open(r'files\song.txt',encoding='utf-8') as f: data = f.read() return data def parse(self): # 匹配时间和歌词返回列表 result = re.findall(r'([\[].+[\]])([\u4e00-\u9fa5]+)',self.content) # 将列表转换成字典key为对应时间,歌词为值 dic_result = dict(result) # 匹配所有对应的时间 times = re.findall(r'([\[][0-2]\d[:][0-5]\d\.\d{2}[\]])',self.content) # 将时间进行排序 new_times = sorted(times,key=lambda x:x[1:-1]) # 依次判断对应的时间是否是否属于key,是则打印时间对应的歌词 for ti in new_times: for dic in dic_result: if ti in dic: print(ti[1:-1],end=' ') time.sleep(1.5) print(dic_result[dic]+'...') time.sleep(2) par1 = Parser() # print(par1.content) # par1.parse() par1.parse()