0

我来自 Ruby,我已经习惯了 Python 遵循的“显式优于隐式”的哲学,但我之前对如何实际创建类方法感到困惑。现在,我想验证我在以下方面确实是正确的:

类中的每个方法本质上都是 Python 中的类方法。

例如:

class Employee(object):

    employeeCount = 0
    def __init__(self, name):
        self.name = name
        employeeCount += 1

    def get_name(self):
        return self.name

    def get_employee_count():
        return employeeCount

如果我理解正确,例如david = Employee("david")以下两个是等效的:

david.get_name()Employee.get_name(david)。同样,我们可以说是一个类方法也是有道理get_employee_count的,但它不依赖任何实例,因此我们不传入实例。这就是 type 没有意义的david.get_employee_count()原因,因为 this 会是Employee.get_employee_count(david),但get_employee_count不接受参数,即实例。这得出结论,我们只需键入Employee.get_employee_count().

我的想法正确吗?谢谢你。

4

2 回答 2

2

不,你不太对。对于要成为类方法而不是实例方法的东西,您必须使用classmethod装饰器。而且该方法仍然需要一个参数,但该参数是类,而不是实例。所以:

@classmethod
def get_employee_count(cls):
    return cls.employeeCount

在 Python 中,类实际上并没有在它们内部定义块作用域,因此仅employeeCount在方法中引用是行不通的——这就是cls使用参数的原因。

为了澄清起见,装饰器只是一个函数的包装器——它也可以写成

def _get_employee_count(cls):
    return cls.employeeCount
get_employee_count = classmethod(_get_employee_count)

并且classmethod是一个内置函数。

另请注意,在 Python 中(正如我在 Ruby 中所想的那样),我们通常不会为简单的变量编写访问器,例如name,我们只是直接访问它们。

于 2013-10-14T20:39:00.653 回答
0

真的。处理对象实例的函数应该包含self在其参数中。否则,它们被视为类方法。

编辑

类方法并不意味着静态方法!它们不是静态方法,除非您在启动类函数@staticmethod之前添加装饰器def

于 2013-10-14T20:31:50.270 回答