首页 > Python 教程 > Python 面向对象 > 在 Python 中使用@staticmethod装饰器定义静态方法

在 Python 中使用@staticmethod装饰器定义静态方法

更新:

@staticmethod是一个内置的装饰器,它在 Python 的类中定义了一个静态方法。 静态方法不接收任何引用参数,无论它是由类的实例调用还是由类本身调用。

@staticmethod 特性

  • 在类中声明静态方法。
  • 它不能有clsself参数。
  • 静态方法无法访问类属性或实例属性。
  • 静态方法可以使用ClassName.MethodName()调用,也可以使用object.MethodName()调用。
  • 它可以返回类的对象。

下面的示例演示如何在类中定义静态方法:

Example: Define Static Method

class Student:
    name = 'unknown' # class attribute

    def __init__(self):
        self.age = 20  # instance attribute

    @staticmethod
    def tostring():
        print('Student Class') 

上面,Student类使用@staticmethod装饰器将tostring()方法声明为静态方法。 注意不能有selfcls参数。

静态方法可以使用ClassName.MethodName()object.MethodName()调用,如下图所示。

Example: Calling Class Method using Object

>>> Student.tostring()
'Student Class'
>>> Student().tostring() 
'Student Class'
>>> std = Student()
>>> std.tostring()
'Student Class' 

静态方法无法访问类属性或实例属性。如果尝试这样做,将会引发错误。

Example: Static Method

class Student:
    name = 'unknown' # class attribute

    def __init__(self):
        self.age = 20  # instance attribute

    @staticmethod
    def tostring():
        print('name=',name,'age=',self.age) 

当您调用上面的静态方法时,下面将是输出。

>>> Student.tostring()
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    Student.tostring()
  File "<pyshell#21>", line 7, in display
    print('name=',name,'age=',self.age)
NameError: name 'name' is not defined 

@classmethod vs @staticmethod

下表列出了类方法与静态方法的区别:

@classmethod @staticmethod
声明一个类方法。 声明一个静态方法。
它可以访问类属性,但不能访问实例属性。 它不能访问类属性或实例属性。
可以使用ClassName.MethodName()object.MethodName()来调用。 可以使用ClassName.MethodName()object.MethodName()来调用。
它可以用来声明返回类对象的工厂方法。 它可以返回类的对象。
顶部