在 Python 中,有两种类型的方法:@classmethod 和 @staticmethod。 这两种方法都与类相关联,而不是与类的实例相关联。虽然这两者在语法上相似,但它们的用途不同,行为也不同。
类方法是绑定到类而不是类的实例方法。Classmethod 被定义为装饰器@classmethod,它接受 class(cls) 作为其第一个参数,该参数使用 cls 表示。因此,classmethod 通常用作构造函数(创建类的新实例)或修改类级属性。类方法不能直接访问或修改特定于实例的属性。
为了理解 classmethod 的用法,让我们看一个代码片段。
class Cat: total_cats = 0 def __init__(self, name): self.name = name Cat.total_cats += 1 @classmethod def show_total_cats(cls): return cls.total_cats
cat1 = Cat("Tom")cat2 = Cat("Jerry")print("Total number of cats", Cat.show_total_cats())# The output of above program will be 2
在上面的例子中,有一个类 Cat,其中 total_cats 是一个类级变量,每次创建一个 Cat 实例时,它都会更新。
但是,当想访问猫的总数时,我直接使用 class 调用了我的方法。 就像 Cat.show_total_cats() 而不是在 cat instance( ) 上调用它。如果是后者,那么结果将是一样的。它将返回整个类的猫计数,而不仅仅是实例的猫计数t1
静态方法未绑定到类或实例。它不需要任何特殊参数,如 classmethods(cls)。它的行为类似于类中的普通方法。Staticmethod 是用装饰器@staticmethod定义的。 staticmethods 不能直接修改特定于实例的属性或类级别的属性。因此,理想情况下,如果想创建一些类独有的方法,则可以使用 staticmethod。
通过一个简单的代码片段来进一步理解它。
class Calculate: @staticmethod def add(a, b): return a+b @staticmethod def sub(a, b): return a-b
print("The sum of 3 and 5 is:", Calculate.add(3, 5))calc = Calculate()print("The difference of 5 and 3 is:", calc.sub(5, 3))# The output of first statement will be 8# The output of secons statement will be 2
在上面的示例中,Calculate类有两个静态方法add和 sub,它们执行简单的算术运算。这些静态方法不需要访问任何类级数据或实例级数据。它们是自给自足的,就像根据提供的输入进行操作一样
此外,如果您看到第一个 print 语句,则可以使用 class(Calculate) 直接访问它,如果您看到第二个 print 语句,我已经创建了我的类的一个对象并使用该实例执行了操作。calcCalculate
因此,总而言之,为了方便起见,staticmethods函数在类内部组织,但它们不依赖于类中的任何数据或行为。可以直接调用它们,而无需创建类的实例。