面对对象-继承案例

# 继承: is a , has a
'''
公路(Road):
      属性:公路名称,公路长度

车(Car):
    属性:车名,时速
    方法:1.求车名在那条公路上以多少的时速行驶了多长,
             get_time(self,road)
          2. 初始化车属性信息__init__方法
           3. 打印对象显示车的属性信息

'''
import random

# 声明(定义)Road
class Road:
    def __init__(self, name, len):
        self.name = name
        self.len = len


# 声明(定义)Car
class Car:
    def __init__(self, brand, speed):
        self.brand = brand
        self.speed = speed

    def get_time(self, road):  # road = r   road 与 r指向同一个地址空间
        ran_time = random.randint(1, 10)
        msg = '{}品牌的车在{}上以{}速度行驶{}小时'.format(self.brand, road.name, self.speed, ran_time)
        print(msg)

    def __str__(self):
        return '{}品牌的,速度:{}'.format(self.brand, self.speed)


# 创建实例化对象
r = Road('京藏高速', 12000)  # name  len
print(r.name)
r.name = '京哈高速'

audi = Car('奥迪', 120)

print(audi)

audi.get_time(r)  # 对象
# student  book   computer
'''
 知识点:
 1. has  a
    一个类中使用了另外一种自定义的类型

    student使用computer  book
2. 类型:
    系统类型:
       str  int  float
       list  dict  tuple  set
    自定义类型:
        算是自定义的类,都可以将其当成一种类型
        s = Student()
        s是Student类型的对象

'''

class Computer:
    def __init__(self, brand, type, color):
        self.brand = brand
        self.type = type
        self.color = color

    def online(self):
        print('正在使用电脑上网....')

    def __str__(self):
        return self.brand + '---' + self.type + "---" + self.color


class Book:
    def __init__(self, bname, author, number):
        self.bname = bname
        self.author = author
        self.number = number

    def __str__(self):
        return self.bname + '---' + self.author + '----' + str(self.number)


class Student:  # has a
    def __init__(self, name, computer, book):
        self.name = name
        self.computer = computer
        self.books = []
        self.books.append(book)

    def borrow_book(self, book):
        for book1 in self.books:
            if book1.bname == book.bname:
                print('已经借过此书!')
                break
        else:
            # 将参数book添加到列表中
            self.books.append(book)
            print('添加成功!')

    def show_book(self):
        for book in self.books:  # book就是一个book对象
            print(book.bname)

    def __str__(self):
        return self.name + "---" + str(self.computer) + '--------' + str(self.books)


# 创建对象
computer = Computer('mac', 'mac pro 2018', '深灰色')

book = Book('盗墓笔记', '南派三叔', 10)

stu = Student('songsong', computer, book)
print(stu)

# 看借了哪些书
stu.show_book()

book1 = Book('鬼吹灯', '天下霸唱', 8)

stu.borrow_book(book1)

print('---------------------')

stu.show_book()

list1 = [12, 'abc', [1, 2, 3], book, computer]
# is a   base class   父类  基类
# Exception
'''
继承:
  Student,Employee,Doctor  ---》 都属于人类
  相同代码 ---》 代码冗余,可读性不高

  将相同代码提取----》Person类
    Student,Employee,Doctor  ---》 继承Person

    class Student(Person):
        pass

'''
class Person:
    def __init__(self, name):
        self.name = name
        self.age = 18

    def eat(self):
        print(self.name + "正在吃饭...")

    def run(self):
        print(self.name + '正在跑步...')


class Student(Person):

    def __init__(self, name):
        print('---------->student的init')
        # 如何调用父类__init__
        super().__init__(name)  # super()  父类对象


class Employee(Person):
    pass


class Doctor(Person):
    pass


s = Student("jack")
s.run()
e = Employee('lily')
e.run()
d = Doctor('tom')
d.run()
# is a   base class   父类  基类
# Exception
'''
继承:
  Student,Employee,Doctor  ---》 都属于人类
  相同代码 ---》 代码冗余,可读性不高

  将相同代码提取----》Person类
    Student,Employee,Doctor  ---》 继承Person

    class Student(Person):
        pass
 特点:
   1. 如果类中不定义__init__,调用父类 super class的__init__
   2. 如果类继承父类也需要定义自己的__init__,就需要在当前类的__init__调用一下父类__init__
   3. 如何调用父类__init__:
       super().__init__(参数)
       super(类名,对象).__init__(参数)
    4. 如果父类有eat(),子类也定义一个eat方法,默认搜索的原则:先找当前类,再去找父类
       s.eat()
       override: 重写(覆盖)
       父类提供的方法不能满足子类的需求,就需要在子类中定义一个同名的方法,这种行为:重写
    5.子类的方法中也可以调用父类方法:
       super().方法名(参数)

'''



class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print(self.name + "正在吃饭...")

    def run(self):
        print(self.name + '正在跑步...')


class Student(Person):
    def __init__(self, name, age, clazz):
        super().__init__(name, age)
        self.clazz = clazz

    def study(self, course):
        print('{}正在学习{}课程'.format(self.name, course))

    def eat(self, food):
        super().eat()
        print(self.name + "正在吃饭...,喜欢吃:" + food)


class Employee(Person):
    def __init__(self, name, age, salary, manager):
        super().__init__(name, age)
        self.salary = salary
        self.manager = manager


class Doctor(Person):
    def __init__(self, name, age, patients):
        super(Doctor, self).__init__(name, age)
        self.patients = patients


s = Student('阿文', 18, 'python1905')
s.run()
s.study('python基础')
s.eat('满汉全席')

e = Employee('tom', 23, 10000, 'king')
e.run()

lists = ['zhangsan', 'lisi', 'wangwu', 'zhaoliu']
d = Doctor('lucy', 30, lists)
d.run()
'''
编写一个简单的工资管理程序,系统可以管理以下四类人:工人(worker)、销售员(salesman)、经理(manager)、销售经理(salemanger)。
所有的员工都具有员工号,姓名,工资等属性,有设置姓名,获取姓名,获取员工号,计算工资等方法。
  1)工人:工人具有工作小时数和时薪的属性,工资计算法方法为工作小时数*时薪。
  2)销售员:具有销售额和提成比例的属性,工资计算方法为销售额*提成比例。
  3)经理:具有固定月薪的属性,工资计算方法为固定月薪。
  4)销售经理:工资计算方法为销售额*提成比例+固定月薪。
请根据以上要求设计合理的类,完成以下功能:
   1)添加所有类型的人员
   2)计算月薪
   3)显示所有人工资情况
'''
class Person:
    def __init__(self, no, name, salary):
        self.no = no
        self.name = name
        self.salary = salary

    def __str__(self):
        msg = '工号:{},姓名:{},本月工资:{}'.format(self.no, self.name, self.salary)
        return msg

    def getSalary(self):
        return self.salary


class Worker(Person):
    def __init__(self, no, name, salary, hours, per_hour):
        super().__init__(no, name, salary)
        self.hours = hours
        self.per_hour = per_hour

    def getSalary(self):
        money = self.hours * self.per_hour
        self.salary += money
        return self.salary


class Salesman(Person):
    def __init__(self, no, name, salary, salemoney, percent):
        super().__init__(no, name, salary)
        self.salemoney = salemoney
        self.percent = percent

    def getSalary(self):
        money = self.salemoney * self.percent
        self.salary += money
        return self.salary


# 创建子类对象
w = Worker('001', 'king', 2000, 160, 50)
s = w.getSalary()
print('月薪是:', s)
print(w)
print('----------------------------------------')
saler = Salesman('002', 'lucy', 5000, 50000000, 0.003)
s = saler.getSalary()
print('月薪是:', s)
print(saler)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
某公司雇员(Employee)包括经理(Manager),技术人员(Technician)和销售员(Salesman)。开发部经理(DeveloperManger),既是经理也是技术人员。销售部经理(SalesManager),既是经理也是销售员。 以Employee类为虚基类派生出Manager,Technician和Salesman类;再进一步派生出Developermanager和Salesmanager类。 Employee类的属性包括姓名、职工号、工资级别,月薪(实发基本工资加业绩工资)。操作包括月薪计算函数(pay()),该函数要求输入请假天数,扣去应扣工资后,得出实发基本工资。 Technician类派生的属性有每小时附加酬金和当月工作时数,及研究完成进度系数。业绩工资为三者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。 Salesman类派生的属性有当月销售额和酬金提取百分比,业绩工资为两者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。 Manager类派生属性有固定奖金额和业绩系数,业绩工资为两者之积。工资总额也为基本工资加业绩工资。 而DeveloperManager类,pay()函数是将作为经理和作为技术人员业绩工资之和的一半作为业绩工资。 SalesManager类,pay()函数则是经理的固定奖金额的一半,加上部门总销售额与提成比例之积,这是业绩工资。 编程实现工资管理。特别注意pay()的定义和调用方法:先用同名覆盖,再用运行时多态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值