"""
1. 创建一个类Circle,具有radius实例属性
编写打印方法,返回属性值
编写实例方法,输出圆的面积
编写析构方法,输出"圆的半径不能为负数"
"""
import math
class Circle:
# 构造方法
def __init__(self, radius):
self.radius = radius
if radius < 0:
print("圆的半径不能为负数")
self.radius = 0
# 打印属性值
def print_radius(self):
print(f"半径为{self.radius}")
# 计算圆的面积
def print_area(self):
area = math.pi * self.radius * self.radius
print(f"圆的面积为{area}")
def __del__(self):
print("圆的半径不能为负数")
# 创建对象
c1 = Circle(5)
c1.print_radius()
c1.print_area()

"""
2. 定义一个狗类Dog
类属性:狗品种breed
定义一个有参的构造方法:有狗姓名name,狗年龄age两个实例属性
定义一个打印方法:返回'[name]、[age] the [breed] is barking!'
定义一个析构方法:输出我是析构方法
实例化一个对象调用打印方法
"""
class Dog:
breed = '哈士奇'
def __init__(self, name, age):
self.name = name
self.age = age
def show(self):
print(f'{self.name}、{self.age} the {self.breed} is barking!')
def __del__(self):
print('我是析构方法')
# 实例化一个对象调用打印方法
dog = Dog('旺财', 3)
dog.show()

"""
3. 要求设计一个学生类Student
类属性学校school,默认值为华清远见
属性有:姓名、html成绩、JavaScript成绩、python成绩
添加打印方法输出完整的学生信息
添加类方法用来修改类属性的值
添加求学生总分的方法
添加求学生平均分的方法
实例化一个学生对象,调用所有方法
"""
class Student:
school = '华清远见'
def __init__(self, name, html, js, python):
self.name = name
self.html = html
self.js = js
self.python = python
# 打印方法
def show(self):
print(f'学校: {self.school},姓名:{self.name},html成绩:{self.html},JavaScript成绩:{self.js},python成绩:{self.python}')
# 修改类属性的方法
@classmethod
def change_school(cls, school):
cls.school = school
# 求总分的方法
def total(self):
return self.html + self.js + self.python
# 求平均分的方法
def avg(self):
return self.total() / 3
s1 = Student('张三', 80, 90, 100)
s1.show()
Student.change_school('池州学院')
s1.show()
print(s1.total())
print(s1.avg())

"""
4. 定义一个Person类
定义一个类属性:国家,默认值为:中国
定义一个构造方法:设置姓名,年龄属性
定义一个静态方法,功能描述:输出“我们都是中国人”
定义一个类方法,用来获取类属性值
定义一个类方法,用来修改类属性值
定义一个打印方法,输出所有属性值
实例化一个对象调用所有方法
"""
class Person:
country = "中国"
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def show():
print("我们都是中国人")
@classmethod
def get_country(cls):
return cls.country
@classmethod
def set_country(cls, country):
cls.country = country
def show_info(self):
print(f"姓名:{self.name},年龄:{self.age},国家:{Person.country}")
p1 = Person("张三", 18)
p1.show()
print(Person.get_country())
Person.set_country("美国")
print(Person.get_country())
p1.show_info()

"""
5. 有一个计算器类,具有运算功能,能对两个整数进行相加运算
有一个闹钟类,具有闹铃功能,能发出“懒猪起床”的声音
有一个手机类,需要同时拥有运算功能和闹铃功能,实现多继承
实例化一个手机类的对象,测试继承的两个功能
"""
class Calculator:
def add(self, a, b):
return a + b
class Alarm:
def alarm(self):
print("懒猪起床")
class Phone(Calculator, Alarm):
pass
phone = Phone()
print(phone.add(1, 2))
phone.alarm()

"""
6. 定义名为Fruit的类
编写构造方法,接收1个外部参数color
编写打印方法,返回属性值
编写Fruit的子类Apple,定义方法setColor,给color赋值
实例化子类对象,调用setColor方法
"""
class Fruit:
def __init__(self, color=None):
self.color = color
# 打印方法,返回属性值
def show(self):
return self.color
class Apple(Fruit):
# 定义方法setColor,给color赋值
def setColor(self, color):
self.color = color
# 实例化子类对象,调用setColor方法
apple = Apple()
apple.setColor('red')
print(apple.show())

"""
7. 定义一个商品类
在构造方法中添加以下属性:ball_name(球类名称)、price(球类价格)、 number(存球数量,默认值为 100),
使用传参的方式对实例属性进行赋值
添加一个打印方法,格式化输出“球类:XXX(ball_name),价格:XX(price),目前存 球数量:XXX(number)”
添加一个析构方法,打印输出“本店已打烊,欢迎下次再来!”
添加一个实例方法 borrow,功能实现将存球数量减 5,并显示当前存球量
添加一个实例方法 restore(n),功能实现将存球量加 n,并显示当前存球量
添加一个实例方法 set_price(m),返回修改后球的价格
添加一个实例方法 get_number,如果存球量大于 100,则返回“本店将要打折处理 库存球”,如果存球量小于 50,则返回“本店将要购买一批新球”,其他则返回“正常营 业!”
创建一个对象:bl = Ball(“篮球”,108,50)
循环调用 borrow 方法直到存球量<=0 时,当存球量为 0 时,输出“库存归 0, 请及时补充库存”
调用测试所有的实例方法
"""
class Ball:
def __init__(self,ball_name,price,number=100):
self.ball_name = ball_name
self.price = price
self.number = number
# show方法
def show(self):
print(f"球类:{self.ball_name}(ball_name),价格:{self.price}(price),目前存 球数量:{self.number}(number)")
# 析构方法
def __del__(self):
print("本店已打烊,欢迎下次再来!")
# borrow方法
def borrow(self):
self.number -= 5
print(f"当前球数量为:{self.number}")
# restore方法
def restore(self,n):
self.number += n
print(f"当前球数量为:{self.number}")
# set_price方法
def set_price(self):
self.price = self.price * 0.9
return self.price
# get_number方法
def get_number(self):
if self.number > 100:
return "本店将要打折处理 库存球"
elif self.number < 50:
return "本店将要购买一批新球"
else:
return "正常营业!"
# 创建对象
b1 = Ball("篮球",108,50)
while b1.number > 0:
b1.borrow()
if b1.number == 0:
print("库存归 0, 请及时补充库存")
break

"""
8. 定义一个信用卡类
用面向对象实现一个信用卡取款,存款,查余额的业务,具体要求如下:
1. 定义一个信用卡类,命名 Creditcard , 添加类属性 area,值为‘中国’
2. 添加魔法构造方法,默认值传参,对象属性及相应的默认值如下:
开户行 bank(默认值为空字符串),存款 money(默认为0),信用额度 credit( 默认为 1000)
3. 添加打印方法,按如下格式返回信息:XX(area)发行的XX(bank)银行 卡,现存款XX(money)元,目前可以透支XX(credit)元
4. 添加一个进入账户的方法 enter(),无参有返。用户从键盘输入用户名和密码,当 输入与以下设置相匹配正确时账户:user 密码:200209,提醒登录成功,返回 布尔值True,否则 False,并提醒:不能使用此卡
5. 添加往卡内存钱的方法 save(n),n 为存入的钱数。
6. 添加提高信用额度的方法 setCredit(n),n 为新的可透支钱数。
7. 添加付款方法 buy(n),n 为要付款的钱数。函数内完成如下功能:首先调用登录方法 enter()。登陆成功后,提示:目前可以消费的额度为XX( money 与 credit 之和)。
9. 创建一个对象 js, 开户行为‘建设银行’。调用往卡内存钱的方法,存入 2000 元打印对象 js
10. 用提高信用额度的方法,把可透支钱数修改为 3000 运行一下付款方法 buy( 2500)
"""
class Creditcard:
area = '中国'
def __init__(self,bank='',money=0,credit=1000):
self.bank = bank
self.money = money
self.credit = credit
# 打印方法
def show(self):
print(f'{self.bank}({self.area})发行{self.bank}银行卡,现存款{self.money}元,目前可以透支{self.credit}元')
# 进入账户
def enter(self):
user = input('请输入用户名:')
password = input('请输入密码:')
if user == 'user' and password == '200209':
print('登录成功')
return True
else:
print('不能使用此卡')
return False
# 往卡内存钱的方法
def save(self,n):
self.money += n
print(f'存入{n}元,当前余额为{self.money}元')
# 提高信用额度的方法
def setCredit(self,n):
self.credit = n
print(f'设置新的可透支额度为{self.credit}元')
# 付款方法
def buy(self,n):
if self.enter():
print(f'目前可以消费的额度为 {self.money + self.credit} 元')
if n <= self.money + self.credit:
if n <= self.money:
# 消费金额小于或等于余额,直接扣除
self.money -= n
else:
# 消费金额大于余额,但在总额度之内
# 先用完余额,再从透支额度中扣除剩余部分
remain = n - self.money
self.money = 0
self.credit -= remain
print(f'付款成功,当前余额为 {self.money} 元,可透支额度为 {self.credit} 元')
else:
print("消费额度超出可用限额!")
else:
print('不能使用此卡')
# 创建一个对象 js, 开户行为‘建设银行’
js = Creditcard('建设银行')
js.show()
js.save(2000)
js.show()
js.setCredit(3000)
js.buy(2500)
