Python静态方法,为什么?

时间:2012-06-06 21:41:02

标签: python oop attributes static-methods class-method

  

可能重复:
  What is the difference between @staticmethod and @classmethod in Python?

我在课堂上有一些关于staticmethods的问题。我将首先举一个例子。

示例一:

class Static:
    def __init__(self, first, last):
        self.first = first
        self.last = last
        self.age = randint(0, 50)
    def printName(self):
        return self.first + self.last
    @staticmethod
    def printInfo():
        return "Hello %s, your age is %s" % (self.first + self.last, self.age)

x = Static("Ephexeve", "M").printInfo()

输出:

Traceback (most recent call last):
  File "/home/ephexeve/Workspace/Tests/classestest.py", line 90, in <module>
    x = Static("Ephexeve", "M").printInfo()
  File "/home/ephexeve/Workspace/Tests/classestest.py", line 88, in printInfo
    return "Hello %s, your age is %s" % (self.first + self.last, self.age)
NameError: global name 'self' is not defined

示例二:

class Static:
    def __init__(self, first, last):
        self.first = first
        self.last = last
        self.age = randint(0, 50)
    def printName(self):
        return self.first + self.last
    @staticmethod
    def printInfo(first, last, age = randint(0, 50)):
        print "Hello %s, your age is %s" % (first + last, age)
        return

x = Static("Ephexeve", "M")
x.printInfo("Ephexeve", " M") # Looks the same, but the function is different.

输出

Hello Ephexeve M, your age is 18

我看到我无法在static方法中调用任何self.attribute,我只是不确定何时以及为何使用它。在我看来,如果你创建一个带有一些属性的类,也许你想稍后使用它们,而不是一个静态方法,其中所有属性都不可调用。 有谁能解释我这个? Python是我的第一个编程langunge,所以如果在Java中这是相同的,我不知道。

1 个答案:

答案 0 :(得分:11)

你想用staticmethod做什么?如果你不知道它的作用,你怎么期望它解决你的问题呢?

或者你只是在玩,看看staticmethod做了什么?在这种情况下,read the docs被告知它的作用可能会更有效率,而不是随意应用它并试图从行为中猜测它的作用。

在任何情况下,将@staticmethod应用于类中的函数定义都会产生“静态方法”。不幸的是,“静态”是编程中最容易混淆的术语之一;这意味着方法不依赖于或改变对象的状态。如果我在类foo中定义了静态方法Bar,那么调用bar.foo(...)(其中bar是类Bar的某个实例)将完全执行无论bar的属性包含什么,都是一样的。事实上,当我甚至没有实例时,我可以直接从班级调用它Bar.foo(...)

这是通过简单地不将实例传递给静态方法来实现的,因此静态方法没有self参数。

静态方法很少需要,但偶尔也很方便。它们与在类外定义的简单函数非常相似,但是将它们放在类中会将它们标记为与类“关联”。您通常使用它们来计算或做与该类密切相关的事情,但实际上并不是对某个特定对象的操作。