Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我使用@classmethod而不是普通的实例方法_Python_Class Method - Fatal编程技术网

Python 为什么我使用@classmethod而不是普通的实例方法

Python 为什么我使用@classmethod而不是普通的实例方法,python,class-method,Python,Class Method,我看了一段youtube视频,解释@classmethods、instance方法和@staticmethods。我知道如何使用它们。我只是不明白什么时候用,为什么用。这是他在youtube视频中给我们的@classmethods代码 class Employee: # class object attributes num_of_emps = 0 raise_amt = 1.04 def __init__(self, first, last, pay):

我看了一段youtube视频,解释@classmethods、instance方法和@staticmethods。我知道如何使用它们。我只是不明白什么时候用,为什么用。这是他在youtube视频中给我们的@classmethods代码

class Employee:

    # class object attributes
    num_of_emps = 0
    raise_amt = 1.04

    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.email = first + '.' + last + '@email.com'
        self.pay = pay

        Employee.num_of_emps += 1

    def fullname(self):
        return f'{self.first} {self.last}'

    def apply_raise(self):
        self.pay = int(self.pay * self.raise_amt)

    @classmethod
    def set_raise_amt(cls, amount):
        cls.raise_amt = amount

    @classmethod
    def from_string(cls, emp_str):
        first, last, pay = emp_str.split('-')
        return cls(first, last, pay)


emp_1 = Employee('Corey', 'Shaffer', 50000)
emp_2 = Employee('Test', 'Employee', 60000)

emp_3 = Employee.from_string('Ezekiel-Wootton-60000')
print(emp_3.email)
print(emp_3.pay)

为什么我对from_string方法使用@classmethod?我认为使用不带修饰符的普通实例方法更有意义,因为我们没有引用类。正确的?!?我们指的是字符串作为参数传递的每个实例

对于来自_string的
,它可以用作替代构造函数。它的用法是这样的

new_employee = Employee.from_string('Corey-Shaffner-50000')
想想看,如果我想用这个方法构造我的第一个
员工
,如果它是一个实例方法,我该怎么做?我还没有任何实例可以调用它


set\u raise\u amt
的情况下,很明显您正在编辑一个类(又称静态)变量,而不是一个实例变量。尽管如此,使用getter和setter通常被认为是糟糕的python。用户应该能够执行以下操作:

Employee.raise_amt = x

其想法是
set\u raise\u amt
更改所有员工的金额,而不是此特定金额。而且
from_string
在命令行中获取它所需的所有信息,因此它不需要实例。感谢dude提供这个示例。