В этой статье мы рассмотрим различные методы, используемые в классе, и поймем, какую роль играет каждый метод. В классе у нас есть разные виды методов, а именно - методы класса, методы экземпляра и статические методы. Хотя они очень просты для понимания, мы часто забываем о сценариях использования, которые пытаются решить эти различные типы методов. Я пытаюсь реализовать эти разные методы, используя простой сценарий использования, который может помочь вам улучшить их понимание. Проблема варианта использования заключается в следующем: у меня есть работодатель, у которого есть разные отделы и типы сотрудников. В течение годового цикла увеличения каждому отделу предоставляется процент бонусов, а также сотрудники, в зависимости от их назначения, получают другой процент бонусов.

Давайте напишем код и поймем, как реализовать описанный выше вариант использования.

class Employer:
    Bonus = 0

    def __init__(self, firstname, pay):
        self.firstname = firstname
        self.pay = pay

    @classmethod
    def increment(cls, bonus):
        cls.Bonus = cls.Bonus + (bonus * 0.01)


    def payment(self):
        return round(self.pay * (1 + self.Bonus))

    @staticmethod
    def email(name):
        return f'{name}@abc.com'
    
class Manager(Employer):
    def __init__(self, name, pay):
        super().__init__(name, pay)
        

class Engineer(Employer):
    def __init__(self, name, pay):
        super().__init__(name, pay)

Мы реализовали три класса Employer, Manager и Engineer. Два класса Manager и Engineer наследуются от класса Employer. Менеджер и инженер забирают все имущество работодателя, отсюда и наследство.

payment: это метод экземпляра

email: это статический метод

increment: это метод класса

Давайте обратимся к этим классам, выполним некоторый код и попытаемся понять три типа методов.

Теперь давайте создадим два отдела нашего работодателя. hr и admin

admin = Employer('Admin', 50000)
hr = Employer('HR', 60000)

print(f'Employer payment to {admin.firstname} with bonus percentage {admin.Bonus}:', admin.payment())
print(f'Employer payment to {hr.firstname} with bonus percentage {hr.Bonus}:', hr.payment())

В приведенном выше коде мы создали два экземпляра класса employer. Эти два отдела admin и hr имеют заработную плату в размере 50000 и 60000 соответственно и с премией в размере 0 процентов.

Вывод кода:

Employer payment to Admin with bonus percentage 0: 50000
Employer payment to HR with bonus percentage 0: 60000

Теперь, когда наши сотрудники много работали в течение года, мы планируем дать им премию в размере 8 процентов.

Employer.increment(8)               # line 1

print(f'Employer payment to {admin.firstname} with bonus percentage {admin.Bonus * 100}:', admin.payment())
print(f'Employer payment to {hr.firstname} with bonus percentage {hr.Bonus * 100}:', hr.payment())

В line 1 мы получили доступ к методу класса с помощью класса Employer и дали приращение всем экземплярам класса.

Вывод кода:

Employer payment to Admin with bonus percentage 8.0: 54000
Employer payment to HR with bonus percentage 8.0: 64800

Мы увидели, что оба наших отдела - HR и Admin получили бонус в размере 8 процентов.

Теперь создадим экземпляры менеджера и инженера.

M = Manager('manager', 100000)

print(f'Employer payment to {M.firstname} with bonus percentage {M.Bonus * 100}: ', M.payment())

Manager.increment(10)                           #Line 2

print(f'Employer payment to {M.firstname} with bonus percentage {M.Bonus * 100}: ', M.payment())

Мы создали экземпляр менеджера и дали ему приращение 10.

En = Engineer('engineer', 80000)

print(f'Engineer payment to {En.firstname} with bonus percentage {En.Bonus * 100}: ', En.payment())

Engineer.increment(15)                            #Line 3

print(f'Engineer payment to {En.firstname} with bonus percentage {En.Bonus * 100}: ', En.payment())

Мы создали экземпляр инженера и дали инженеру приращение 15.

Вывод приведенного выше кода выглядит следующим образом:

Employer payment to manager with bonus percentage 8.0:  108000
Employer payment to manager with bonus percentage 18.0:  118000
Engineer payment to engineer with bonus percentage 8.0:  86400
Engineer payment to engineer with bonus percentage 23.0:  98400

Выходные данные показывают, что у менеджера был процент бонуса по умолчанию 8, а после увеличения его процент бонуса изменился на 18. Точно так же процент бонуса инженера был 8 и был изменен на 23, давая прирост.

Примечание. Процент по умолчанию 8 - это приращение, которое мы изначально дали всем отделам.

Оба класса Manager и Engineer имеют независимый процент бонуса, потому что мы использовали метод класса для изменения переменной bonus. И, следовательно, каждый класс действует как независимая сущность. Мы используем метод экземпляра payment для расчета оплаты для каждой созданной нами сущности. Если мы увидим переменную bonus класса Employer, она будет иметь тот же 8 процент, который мы дали изначально.

print (f'The bonus percent is {Employer.Bonus * 100}')
The bonus percent is 8.0

Когда мы хотим реализовать функциональность, зависящую от класса, мы используем методы класса. Когда мы хотим реализовать функциональность, в которой каждый экземпляр должен действовать независимо и зависеть от конкретного экземпляра, мы используем методы экземпляра.

Метод класса - это метод, который привязан к классу, а не к его объекту. Статические методы, как и методы класса, - это методы, которые привязаны к классу, а не к его объекту. Хотя метод класса работает с классом, поскольку его параметром всегда является сам класс, статический метод ничего не знает о классе и имеет дело только с параметрами.

email_id1 = M.email(M.firstname)
email_id2 = Manager.email('manager2')

print(f'The mail Id of the employee is {email_id1}')
print(f'The mail Id of the employee is {email_id2}')

Выход:

The mail Id of the employee is [email protected]
The mail Id of the employee is [email protected]

Статические методы не имеют ничего общего с объектами и экземплярами классов. Эти методы используются для реализации определенного аспекта, который, по нашему мнению, может быть полезен для этого конкретного класса. Написание функции вне класса будет действовать аналогичным образом.

Мы можем реализовать больше вокруг этого, где каждый менеджер в одном отделе имеет определенное приращение бонуса, а также мы могли бы добавить стимулы и другие аспекты. Использование не ограничено.

Надеюсь, вы лучше понимаете, как используются эти разные типы методов. Если есть вопросы, комментируйте, и я постараюсь ответить на них.