# @Time : 2021/7/31 12:10 下午 
# @File : main.py 
# @Software: PyCharm

#导入类

#实际上就是from *** import ***
from car import Car   #导入类
#我们也可以在一个"模块"(其实就是文件)中储存多个类

from car import EletricCar

my_tesla=EletricCar('tesla','model s',2019,10)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()#查看电池容量
my_tesla.battery.get_range()#查看可以走的行程数
my_tesla.getNumberOfPerson()

#从一个模块中导入多个类
from car import Car,EletricCar

my_beetle=Car('volkswagen','beetle',2019,10)
print(my_beetle.get_descriptive_name())

my_tesla=EletricCar('tesla','model s',2019,10)
print(my_tesla.get_descriptive_name())

#或者说,可以导入整个"模块"(文件)
#再通过句点运算符
import car
my_tesla=car.EletricCar('tesla','model s',2019,10)
name=my_tesla.get_descriptive_name()
print(name)

my_beetle=car.Car('volkswagen','beetle',2019,10)
print(my_beetle.get_descriptive_name())

#导入模块中的所有类
#其实和函数那里是如出一辙的

from car import *
#当然这种语法也是不推荐的

#需要从一个模块中导入很多种类时
#就利用导入整个模块+句点运算符的方式就非常好

from car import Car   #可以看到在生成特斯拉汽车的时候这条语句实际上是没有用到的
from electric_car import EletricCar
my_tesla=EletricCar('tesla','model s',2019,10)
name=my_tesla.get_descriptive_name()
print(name)

my_beetle=car.Car('volkswagen','beetle',2019,10)
print(my_beetle.get_descriptive_name())


#和函数一致,类也要学会利用别名简化代码
from electric_car import EletricCar as Ele

my_tesla=Ele('tesla','model s',2019,10)
name=my_tesla.get_descriptive_name()
print(name)


#原则:在不熟练时,先让代码可行,再让它的结构变得更好

#page161

from Restaurant import Restaurant as RES
my_res=RES('haojiahuo','abaaba')
my_res.open_restaurant()
my_res.describe_restaurant()

from admin import Admin
my_ad=Admin('a','b',100,1,2,3,4,5)
my_ad.show_privileges()


# @Time : 2021/7/31 12:27 下午 
# @File : electric_car.py 
# @Software: PyCharm


#就是尝试一下在一个模块中导入另一个模块的效果
from car import Car
#电池类
class Battery:
    def __init__(self,battery_size=75):
        self.battery_size=battery_size

    def describe_battery(self):
        print(f"This car has a {self.battery_size}-kWh battery.")

    def get_range(self):
        '''打印一条消息指出电车续航里程'''
        if self.battery_size==75:
            range=260
        elif self.battery_size==100:
            range=315
        else:
            range=0
        print(f"the car can go about {range} miles on a full charge.")

    def upgrade_battery(self):
        if self.battery_size!=100:
            self.battery_size=100



class EletricCar(Car):
    '''电动车的独特之处'''

    def __init__(self,make,model,year,number_served):
        '''调用父类"构造函数"'''
        super().__init__(make,model,year,number_served)
        self.new_battery_size=75#为子类定义新的属性
        self.battery=Battery(75)#对象作为属性,即C++的对象成员
        #这个语句是很重要的,是python和C++不同的地方,这里没有使用初始化列表而是直接利用函数调用
        #这就是python的风格
    def descirbe_battery_size(self):#为子类定义新的方法
        print(f"the battery size is {self.new_battery_size}.")

    def fill_gas(self):
        print("the electricCar doesn't need gas!".upper())


# @Time : 2021/7/31 12:15 下午
# @File : car.py 
# @Software: PyCharm

class Car:
    def __init__(self,make,model,year,number_served):
        self.make=make
        self.model=model
        self.year=year
        self.odometer_reading=0
        self.number_served=number_served

    def get_descriptive_name(self):
        long_name=f"{self.year} {self.make} {self.model}"
        return long_name.title()

    def read_odometer(self):
        print(f"this car has {self.odometer_reading} miles on it.".title())

    def update_odometer(self,mileage):
        if mileage>=self.odometer_reading:
            self.odometer_reading=mileage
        else:
            print("you can't roll back an dodmeter.")

    def increment_odometer(self,miles):
        if miles>=0:
            self.odometer_reading+=miles
        else:
            print("you can't roll back an dodmeter.".upper())

    def getNumberOfPerson(self):
        print(f"here are {self.number_served} in this car.")

    def setNumber(self,number):
        self.number_served=number

    def increment_number(self,number):
        self.number_served+=number
    def fill_gas(self,gas_v):
        print(f"here are your gas totolly-{gas_v} L.")


#电池类
class Battery:
    def __init__(self,battery_size=75):
        self.battery_size=battery_size

    def describe_battery(self):
        print(f"This car has a {self.battery_size}-kWh battery.")

    def get_range(self):
        '''打印一条消息指出电车续航里程'''
        if self.battery_size==75:
            range=260
        elif self.battery_size==100:
            range=315
        else:
            range=0
        print(f"the car can go about {range} miles on a full charge.")

    def upgrade_battery(self):
        if self.battery_size!=100:
            self.battery_size=100



class EletricCar(Car):
    '''电动车的独特之处'''

    def __init__(self,make,model,year,number_served):
        '''调用父类"构造函数"'''
        super().__init__(make,model,year,number_served)
        self.new_battery_size=75#为子类定义新的属性
        self.battery=Battery(75)#对象作为属性,即C++的对象成员
        #这个语句是很重要的,是python和C++不同的地方,这里没有使用初始化列表而是直接利用函数调用
        #这就是python的风格
    def descirbe_battery_size(self):#为子类定义新的方法
        print(f"the battery size is {self.new_battery_size}.")

    def fill_gas(self):
        print("the electricCar doesn't need gas!".upper())
#实际上python继承的语法和过程都比C++更简单
#尤其是super行语句,实际上就相当于一个简单的函数调用而已
#同样python当然也支持对父类中的方法进行一个重定义
#编程语言总有惊人的一致性,比如对象作为属性这一点,定义一个battery的类,将其对象作为电车的属性

# @Time : 2021/7/31 12:39 下午 
# @File : admin.py 
# @Software: PyCharm
import user
from privileges import Privileges
class Admin(user.User):
    def __init__(self,first,last,login_attempts,*otherThing):
        super().__init__(first,last,login_attempts,*otherThing)
        self.Privileges=Privileges()
        self.Privileges.privileges.append(['aaaaaa,fansile'])

    def show_privileges(self):
        for item in self.Privileges.privileges:
            print(f"here are you that {item}.".upper())


# @Time : 2021/7/31 12:38 下午 
# @File : privileges.py 
# @Software: PyCharm
class Privileges:
    def __init__(self):
        self.privileges=['can add post','can delete post','can ban user']

# @Time : 2021/7/31 12:35 下午 
# @File : Restaurant.py 
# @Software: PyCharm
class Restaurant:
    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name=restaurant_name
        self.cuisine_type=cuisine_type

    def describe_restaurant(self):
        print(f"here is a restaurant named {self.restaurant_name} and the cuisine is {self.cuisine_type}.".strip())

    def open_restaurant(self):
        print("ok,the restaurant is now opening.".title())


# @Time : 2021/7/31 12:37 下午 
# @File : user.py 
# @Software: PyCharm
class User:
    def __init__(self,first,last,login_attempts,*otherThing):
        self.first_name=first
        self.last_name=last
        self.other_thing=otherThing
        self.login_attempts=login_attempts

    def describe_user(self):
        print(f"there is a user named {self.first_name+' '+self.last_name}.")
        print('and there are other things about him:')
        for item in self.other_thing:
            print(item)

    def greet_user(self):
        print(f"hei,{self.first_name+' '+self.last_name}.")

    def increment_login_attempts(self):
        self.login_attempts+=1

    def set_login_attempts(self,attempts_new):
        self.login_attempts=attempts_new

    def reset_login_attempts(self):
        self.login_attempts=0