2020-10-24-继承与内存管理及作业

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数据会自动销毁
"""
作业
  1. 建立一个汽车类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)
    
  2. 创建一个Person类,添加一个类字段用来统计Perosn类的对象的个数

    class Person:
        count = 0
        def __init__(self):
            Person.count +=1
    
    per = Person()
    per1 = Person()
    per2 = Person()
    print(Person.count)  #  3
    
  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, 类型:波斯猫/
    
  4. 写一个圆类, 拥有属性半径、面积和周长;要求获取面积和周长的时候的时候可以根据半径的值把对应的值取到。但是给面积和周长赋值的时候,程序直接崩溃,并且提示改属性不能赋值

    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)
    
  5. 写一个扑克类, 要求拥有发牌和洗牌的功能(具体的属性和其他功能自己根据实际情况发挥)

    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())
    
    
  6. (尝试)写一个类,其功能是: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()
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值