#!/user/bin/python3
# -*- coding: utf-8 -*-
# @Time : 2020/6/8 0008 23:48
# @Author : lemon_小张
# @Email :981874735@qq.com
# @File :class_10作业.py
# TODO

# 1, 详细总结类和对象知识点,包括:
'''类的属性'''

# print("类的定义:同一类事物的 抽象描述(属性、功能)
# 比如一家公司是一个类;而我或者我们部门只是公司的一个对象
# 对象:
# 属性:研发部;测试部;交互设计部;产品部;运营部等
# 功能:开发根据需求编写代码 测试根据开发编写好的代码从功能上找出缺陷
# 产品:根据用户的反馈或者需求编写策划文档")
'''对象的初始化'''
# 类里面的初始化函数使用在实例化的调用;
# 实例化的同时,自动调用__init__。
# __init__有几个参数,那你在实例化时,就要传几个
# class Test:
# def __init__(self,类属性,):
# self.name = name self实例等于本身
# self.dog_kind = kind
# self.dog_age = age
# 调用是
# 实例 =类名
# te = Test()#初始化时传入几个参数;对应在类名括号传入几个参数;不然会报错
# 同时可以传参为不定长参数/*args **kwages
'''类属性'''
# 直接在类当中定义的。不在任何的实例方法当中
# # 比如:age = "3个月" name = "嘟嘟"

'''实例属性'''
# self.属性名 self.age/self.name
'''实例方法'''
# 参数第一个是self
# 实例都是可以访问类属性,类方法的。
# 只有实例才可以访问。
#
'''类方法'''
# 函数加上@classmethod 参数默认为cls。cls表示类本身。
# 可以通过cls访问类的属性,但是不能访问实例属性。
# 类可以访问,对象可以访问。
'''静态方法'''
# @staticmethod 普通函数
# def hello():
# print("hello")
#
# class Dog:
#
# def bark(self):
# print("叫")
#
# @classmethod
# def set_kind(cls):
# cls.kind = "狗"
#
# @staticmethod
# def hello(flag=True):
# print("hello,dog!!")
#
#
# Dog.hello()
# d = Dog()
# d.hello()
'''继承'''
# 即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
# 例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系
#
# 继承语法 :class 子类(父类)
# 潜规则 - 告诉你这是私有化的,全靠对象自觉。硬要用也是可以的,不会报错。
# 类定义时,_开头的属性 / 方法,父类内部 / 子类内部都可以用。
# 父 / 子对象不建议使用。
#
# 子类和父类有同名方法的时候:
#
# 继承使用父类的同名方法。但是在父类的基础上,再拓展内容。
# super().同名方法
# 多继承:任何一个类,可以有N个父类
# 继承来讲:自己有用自己的,自己没有用,一层层往上找
'''重写'''
# 重写:如果要使用父类的同名方法,使用super().同名方法名()
'''super()函数'''

# class Cat(Base):
#
# def __init__(self,name,sex):
# super().__init__(name)
# self.sex = sex
#
# def climb(self):
# print("Cat会爬树!!")
# self.eat() #
#
# def sleep(self):
# # 完全覆盖。一点都不用父类的。
# # print("cat呼呼大睡!!!")
# # 继承使用父类的同名方法。但是在父类的基础上,再拓展内容。
# super().sleep()
# print("我使用爸爸睡觉的姿势,顺便再加了一个姿势!!")
#
#
#
# c = Cat("英短","母")
# c.sleep()
'''2, 定义一个类 Dog, 包含 2 个属性:名字和年龄。
定义一个方法 eat 吃东西。
定义一个类 TeddyDog, 继承 Dog 类, Teddy 在吃东西的时候还会望着你, 定义方法 watch_you.
定义一个类 BabyTeddyDog, 继承 TeddyDog, BabyTeddy 吃东西不仅会望着你,还会四处转悠, 定义方法 go_around
'''
print("2题*******************************************************")
class Dog:
def __init__(self,name,age):#初始化函数,定义名字和年龄
self.name=name
self.age=age
def eat(self):
return F"{self.name}现在{self.age}岁,它正在吃东西!!"
class TeddyDog(Dog):
def watch_you(self):
return F"{super().eat()},不仅会望着你"
class BabyTeddyDog(TeddyDog):
def go_around(self):
return F"{super().watch_you()},,还会四处转悠"

Teddy=TeddyDog("Teddy",16)
print(Teddy.eat())
print(Teddy.watch_you())
Teddy1=BabyTeddyDog("Teddy",16)
print(Teddy1.go_around())


# 二、选作题(不需要提交)
# 1.编写如下程序
# 编写一个工具箱类和工具类
#
# 工具类:需要有工具具的名称、功能描述、价格。
#
# 工具臬类:能够添加工具、删除工具、查看工具,并且能获取工具箱中工具的总数。
#
# 比如锤子、斧头、螺丝刀等工具。
print("二题*********************************************")
tool_list = {}
tools_list = []
class Tools:

def __init__(self, name, Features=None, price=None):
self.name = name
self.Features = Features
self.price = price

def save(self):
tools_info = dict(name=self.name,Features=self.Features,price=self.price)
tool_list[self.name] = [tools_info]
return tool_list
class ToolCase(Tools):
@staticmethod
def del_tool(name):
if name in tools_list:
tools_list.remove(name)
return tools_list
else:
return '您要删除的工具不存在'

def add_tool(self):
tools_list.append(self.name)

def get_tool(self):
return tools_list

def total_tool(self):
return len(tools_list)
tool01 = Tools('大刀', Features='劈柴', price=100)
tool02 = Tools('西瓜刀', Features='砍西瓜', price=50)
tool01.save(), tool02.save()
print(tool_list)
tools01 = ToolCase('大刀')
tools01.add_tool()
tools02 = ToolCase('西瓜刀')
tools02.add_tool()
print(tools02.get_tool())
print(tools01.total_tool())
print(tools01.del_tool('狗子'))