我该如何接受用户的输入,如果它等于1,那就是白天,2就是晚上?

2024-06-23 19:20:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图得到用户的输入,如果输入1的班次,它将打印出白班和2将等于夜班。我是用面向对象来做这个的,所以我不知道怎么做,因为我对它很陌生。另外,我在这里读到,教授教我设置类的方法并不是python的最佳方法,但教授就是这么想的,我对此无能为力。你知道吗

班级员工

class Employee:
    def __init__(self, name, number):
        self.__name = name
        self.__number = number

    def set_name(self, name):
        self.__name = name

    def set_number(self, number):
        self.__number = number

    def get_name(self):
        return self.__name

    def get_number(self):
        return self.__number

班级生产工人

import employee

class ProductionWorker(employee.Employee):
    def __init__(self, name, number, shift, pay):
        employee.Employee.__init__(self, name, number)

        self.__shift = shift

        self.__pay = pay

    def set_shift(self, shift):
        self.__shift = shift


    def set_pay(self, pay):
        self.__pay = pay

    def get_shift(self):
        return self.__shift

    def get_pay(self):
        return self.__pay

    def dayNight(self, shift):
        if shift == 1:
            self.__shift = "Day Shift"
        else:
            self.__shift = "Night Shift"

    def __str__(self):
        return "\nName: " + self.get_name() + "\nNumber: " + self.get_number() + \
               "\nShift: " + self.get_shift() + "\nPay: " + self.__pay

员工测试

import ProductionWorker


def main():
    name = input("Enter the users name: ")
    number = input("Enter the users number: ")
    shift = input("Enter the users shift (1, 2): ")
    pay = input("Enter the users hourly pay rate: ")    


    employee = ProductionWorker.ProductionWorker(name, number, shift, pay)
    empShift = employee.get_shift()
    print(employee)

main()

Tags: thenameselfnumberinputgetreturnshift
3条回答

可以使用dict映射将移位到“1”和“2”,然后使用实例移位值进行查找。你知道吗

class ProductionWorker(employee.Employee):
    def __init__(self, name, number, shift, pay):
        employee.Employee.__init__(self, name, number)
        self.shifts = {"1":"Day shift","2":"Night shift"}  


def main():
    name = input("Enter the users name: ")
    number = input("Enter the users number: ")
    shift = input("Enter the users shift (1, 2): ")
    pay = input("Enter the users hourly pay rate: ")    


    employee = ProductionWorker.ProductionWorker(name, number, shift, pay)
    empShift = employee.get_shift()
    print(employee)
    print(employee.shifts[empShift])

main()

如果类中需要,可以使用方法,逻辑基本相同。你知道吗

要使用__str__打印所有详细信息,只需在get_shift方法中进行查找,而不只是返回self。\u shift:

class ProductionWorker.ProductionWorker(Employee):
    def __init__(self, name, number, shift, pay):
         employee.Employee.__init__(self, name, number)
        self.shifts = {"1": "Day shift", "2": "Night shift"}
        self.__shift = shift
        self.__pay = pay

    def set_shift(self, shift):
        self.__shift = shift

    def set_pay(self, pay):
        self.__pay = pay

    def get_shift(self):
        return self.shifts[self.__shift]

    def get_pay(self):
        return self.__pay

    def dayNight(self, shift):
        return self.shifts[shift]

    def __str__(self):
        return "\nName: {}\nNumber: {}\nShift: {}\nPay: {}".\
            format(self.get_name(), self.get_number(), self.dayNight(self.get_shift()), self.__pay)

输出:

Enter the users name: foo
Enter the users number: 1234
Enter the users shift (1, 2): 2
Enter the users hourly pay rate: 100

Name: foo
Number: 1234
Shift: Night shift
Pay: 100

如果要将DayNight方法与If/else结合使用,则必须将其与字符串(而不是int)进行比较,最简单的方法就是返回字符串:

    def set_shift(self, shift):
        self.__shift = shift

    def set_pay(self, pay):
        self.__pay = pay

    def get_shift(self):
        return self.__shift

    def get_pay(self):
        return self.__pay

    def dayNight(self, shift):
        if shift == "1":
            return"Day Shift"
        else:
            return "Night Shift"

    def __str__(self):
        return "\nName: {}\nNumber: {}\nShift: {}\nPay: {}".\
            format(self.get_name(), self.get_number(), self.dayNight(self.get_shift()), self.__pay)

问题是您在ProductionWorker类中定义了一个实例方法dayNight,但从未使用过它,或者您应该修改定义,并在像这样实例化类对象之后显式调用它(也不需要传递shift参数):

昼夜定义:

    def dayNight(self):
        if self.__shift == 1:
            self.__shift = "Day Shift"
        else:
            self.__shift = "Night Shift"

然后实例化如下:

    employee = ProductionWorker.ProductionWorker(name, number, shift, pay)
    employee.dayNight()
    print(employee)

或者

为此,请仅修改初始化

    def __init__(self, name, number, shift, pay):
        employee.Employee.__init__(self, name, number)
        if shift == 1:
            self.__shift = "Day Shift"
        else:
            self.__shift = "Night Shift"

然后实例化如下:

    employee = ProductionWorker.ProductionWorker(name, number, shift, pay)
    print(employee)

我将创建一个名为display_shift的方法,该方法显示存储在静态类的dict属性中的人类可读的移位名称:

class ProductionWorker(employee.Employee):
    SHIFT_NAMES = {
        '1': 'day',
        '2': 'night',
        'W': 'weekend',  # just an example how you could easily add other shifts
    }

    # ...other code...

    def display_shift(self):
        return self.SHIFT_NAMES[self.get_shift()]

# ...init code...

employee = ProductionWorker(name, number, shift, pay)
print(employee.display_shift())  # 'day' or 'night'

静态dictSHIFT_NAMES的替代方法有:

  • 实例dict在__init__中设置为self.shift_names = {...},这将允许一些方法,如def add_shift(self, shift_number, shift_name)添加公司可能需要的任何新班次(加班?周末?假期?)

  • 一个元组,如SHIFT_NAMES = ('day', 'night')display_shift,如return self.SHIFT_NAMES[int(self.get_shift()) - 1]。这样做的好处是无法更改或添加班次名称。一个缺点是移位需要保持连续有序int,而且移位编号和移位名称之间的直接关系并不明确。

  • 一个单独的静态类或collections.namedtuple是其他的可能性

编辑:

要在调用str(employee)时显示移位,可以使用__str__魔术方法执行以下操作:

def __str__(self):
    return '{}({}, #{}, {} shift, ${}/hr)'.format(
        self.__class__.__name__, self.get_name(), self.get_number(),
        self.display_shift(), self.get_pay())

这将导致如下结果:

>>> print(employee)
ProductionWorker(John Doe, #12345, day shift, $40/hr)

你可以read more about Python magic methods here.

相关问题 更多 >

    热门问题