مدیریت کارکنان
این تمرین در اصل برای ارسال چند فایل جدا (در یک zip) نوشته شده است. در این نسخه همهی کلاسها را در همین یک فایل بنویس — import بین فایلها لازم نیست و کار هم نمیکند، و فایل zip هم فرستاده نمیشود. کد خودت را بنویس و بفرست.
در این بخش از پروژه از شما خواسته میشود سه کلاس به نامهای Worker (کارگر)، Teacher (معلم) و Engineer (مهندس) را تکمیل کنید. این سه کلاس باید از کلاس Person (شخص) که در فایل person.py ارائه شده است، ارث ببرند.
برای هر یک از این کلاسهای فرزند، لازم است موارد زیر را پیادهسازی کنید:
- سازنده (
__init__) - متد
get_price: محاسبهی هزینهی استخدام - متد
calc_life_cost: محاسبهی هزینههای زندگی - متد
calc_income: محاسبهی درآمد
در ادامه، جزئیات پیادهسازی هر بخش شرح داده شدهاست.
📂 ساختار پروژهی اولیه
Employee Management
├── teacher.py
├── worker.py
├── engineer.py
└── person.py
شما باید سه فایل worker.py، teacher.py و engineer.py را تکمیل کنید. همچنین باید تغییرات فایل person.py که در اولین تمرین پروژه انجام دادید را در اینجا نیز اعمال کنید.
کلاسهای Worker، Teacher و Engineer
برای هر یک از کلاسهای Worker، Teacher و Engineer، موارد زیر را پیادهسازی کنید.
متد سازنده در هر سه کلاس باید به شکل زیر باشد:
- علاوهبر
self، دو آرگومانnameوageدریافت میشوند.- ابتدا، سازندهی کلاس والد (
Person) را با استفاده ازsuper()برای آرگومانهایnameوageفراخوانی میکند.- سپس، ویژگی
self.jobدر هر کلاس مطابق با تخصص آن کلاس تنظیم شود: کلاسWorker:"worker"کلاسTeacher:"teacher"کلاسEngineer:"engineer"
class Worker(Person):
def __init__(self, name, age):
super().__init__(name, age)
self.job = "worker"
این متد باید هزینهی استخدام شخص را بر اساس تخصص (
self.job) و سن او (self.age) محاسبه کرده و بازگرداند. مقدار بازگشتی این متد باید از نوعintباشد.فرمول محاسبهی هزینه برای هر تخصص به شرح زیر است.
کارگر (Worker)
price = ⌊Consts.BASE_PRICE["worker"] × (Consts.MIN_AGE / self.age)⌋
معلم (Teacher)
price = Consts.BASE_PRICE["teacher"] − (self.age − Consts.MIN_AGE) × Consts.AGE_MUL
مهندس (Engineer)
price = ⌊Consts.BASE_PRICE["engineer"] × (Consts.MIN_AGE / self.age)⌋
💡 راهنمایی ۱: ثابتهای
MIN_AGEوAGE_MULاز طریقConsts.MIN_AGEوConsts.AGE_MULدر فایلperson.pyقابل دسترسی هستند. قیمت پایه (BasePrice) برای هر تخصص در دیکشنریConsts.BASE_PRICE(در فایلperson.py) ذخیره شدهاست و با استفاده ازConsts.BASE_PRICE[self.job]قابلدسترسی است.
def get_price(self):
if self.job == "worker":
return int(Consts.BASE_PRICE[self.job] * (Consts.MIN_AGE / self.age))
elif self.job == "teacher":
return Consts.BASE_PRICE[self.job] - (self.age - Consts.MIN_AGE) * Consts.AGE_MUL
elif self.job == "engineer":
return int(Consts.BASE_PRICE[self.job] * (Consts.MIN_AGE / self.age))
این متد باید مقدار مخارج زندگی شخص را بر اساس تخصص (
self.job) و سن او (self.age) محاسبه کرده و بازگرداند. مقدار بازگشتی این متد باید از نوعintباشد.فرمول محاسبه برای هر تخصص به شرح زیر است.
کارگر (Worker)
costs = ⌊Consts.BASE_COST["worker"] × (Consts.MIN_AGE / self.age)⌋
معلم (Teacher)
costs = Consts.BASE_COST["teacher"] + (self.age − Consts.MIN_AGE) × Consts.AGE_MUL
مهندس (Engineer)
costs = ⌊Consts.BASE_COST["engineer"] × (Consts.MIN_AGE / self.age)⌋
💡 راهنمایی ۲: ثابت
MIN_AGEاز طریقConsts.MIN_AGEدر فایلperson.pyقابل دسترسی است. مخارج پایه (BaseCost) برای هر تخصص در دیکشنریConsts.BASE_COST(در فایلperson.py) ذخیره شدهاست و با استفاده ازConsts.BASE_COST[self.job]قابلدسترسی است.
def calc_life_cost(self):
if self.job == "worker":
return int(Consts.BASE_COST[self.job] * (Consts.MIN_AGE / self.age))
elif self.job == "teacher":
return Consts.BASE_COST[self.job] + (self.age - Consts.MIN_AGE) * Consts.AGE_MUL
elif self.job == "engineer":
return int(Consts.BASE_COST[self.job] * (Consts.MIN_AGE / self.age))
این متد باید درآمد شخص را بر اساس تخصص (
self.job)، سن (self.age) و محل کار او (self.work_place) محاسبه کرده و بازگرداند. مقدار بازگشتی این متد باید از نوعintباشد.فرمول محاسبه برای هر تخصص به شرح زیر است.
کارگر (Worker)
income = ⌊Consts.BASE_INCOME["worker"][expertise] × (Consts.MIN_AGE / self.age)⌋
معلم (Teacher)
income = Consts.BASE_INCOME["teacher"][expertise] − (self.age − Consts.MIN_AGE) × Consts.AGE_MUL
مهندس (Engineer)
income = ⌊Consts.BASE_INCOME["engineer"][expertise] × (Consts.MIN_AGE / self.age)⌋
💡 راهنمایی ۳: ثابتهای
MIN_AGEوAGE_MULاز طریقConsts.MIN_AGEوConsts.AGE_MULدر فایلperson.pyقابل دسترسی هستند. درآمد پایه (BaseIncome) پیچیدهتر است. در دیکشنری تودرتویConsts.BASE_INCOME(در فایلperson.py) ذخیره شدهاست. برای دسترسی به آن از ساختارConsts.BASE_INCOME[self.job][self.work_place.get_expertise()]استفاده کنید.
def calc_income(self):
expertise = self.work_place.get_expertise()
if self.job == "worker":
return int(Consts.BASE_INCOME[self.job][expertise] * (Consts.MIN_AGE / self.age))
elif self.job == "teacher":
return Consts.BASE_INCOME[self.job][expertise] - (self.age - Consts.MIN_AGE) * Consts.AGE_MUL
elif self.job == "engineer":
return int(Consts.BASE_INCOME[self.job][expertise] * (Consts.MIN_AGE / self.age))
💡 چالشهای حل تمرین
⚠️ چگونه از کلاس
Personو کلاسConstsاستفاده کنم؟برای استفاده از کلاس
Personو کلاسConstsدر فایلهایworker.py،teacher.pyوengineer.py، آنها را بهصورت زیر از فایلperson.pyوارد کنید:کلاس
Personرا مطابق آنچه در تمرین اول پروژه پیادهسازی کردید، خودتان تکمیل کنید. توجه کنید کلاسConstsدقیقاً مشابه آنچه در پروژهی اولیهی این بخش آمدهاست باشد.
from person import Person, Consts
⚠️ چگونه شیء
super()را استفاده کنم؟برای فراخوانی متد سازنده کلاس والد از
super()به شکل زیر استفاده کنید:
super().__init__(name, age)
⚠️ چرا با اینکه فرمولهای ریاضی را بهدرستی پیادهسازی کردهام، نمرهی مربوط به توابع محاسباتی را دریافت نمیکنم؟
توجه کنید در هر سه تابع محاسباتی، باید مقدار نهایی را بهصورت عدد صحیح درآورید و آن را برگردانید.
⚠️ مشکلات متداول
- در هیچیک از توابع نباید مقداری را چاپ کنید، بلکه باید مقادیر خواستهشده را با استفاده از
returnبرگردانید. دقت داشته باشید که برخی توابع (مطابق توضیحاتشان) نیازی به برگرداندن مقدار ندارند.- حتماً فایل
person.pyکه در تمرین قبل تکمیل کردید را به این قسمت انتقال دهید و همراه دیگر فایلها ارسال کنید.
نمونهها
[Worker("a", 20).job, Teacher("b", 30).job, Engineer("c", 40).job]['worker', 'teacher', 'engineer']
[Worker("w", 30).get_price(), Teacher("t", 30).get_price(), Engineer("e", 30).get_price()]
[Worker("w", 17).get_price(), Teacher("t", 17).get_price(), Engineer("e", 17).get_price()][600, 1350, 1000] [1058, 1480, 1764]
[Worker("w", 30).calc_life_cost(), Teacher("t", 30).calc_life_cost(), Engineer("e", 30).calc_life_cost()]
[Worker("w", 45).calc_life_cost(), Teacher("t", 45).calc_life_cost(), Engineer("e", 45).calc_life_cost()][100, 300, 150] [66, 450, 100]
w = Worker("w", 20)
w.work_place = StandInMine()
t = Teacher("t", 25)
t.work_place = StandInMine()
e = Engineer("e", 60)
e.work_place = StandInMine()
[w.calc_income(), t.calc_income(), e.calc_income()][600, 200, 250]
e = Engineer("e", 30)
e.upgrade()
e.work_place = StandInMine(level=8)
e.calc()1850.0
values = [Worker("w", 23).get_price(), Engineer("e", 23).calc_life_cost()]
[type(v).__name__ for v in values]
[isinstance(Teacher("t", 20), Person), len(Person.instances)]['int', 'int'] [True, 3]
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود