oop:Python静态方法,为什么?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the difference between @staticmethod and @classmethod in Python?

我有几个关于静态方法的问题。我将以一个例子开始。

一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
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()

输出:

1
2
3
4
5
6
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

两个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.

输出

1
Hello Ephexeve M, your age is 18

我看我不能召唤任何自我。属性,我只是不确定什么时候以及为什么要使用它。在我看来,如果您创建一个带有几个属性的类,您可能希望以后使用它们,而不是使用一个所有属性都不可调用的静态方法。有人能解释一下吗?Python是我的第一个编程语言,所以如果在Java中也是这样,我就不知道了。


你想用那个staticmethod实现什么?如果你不知道它的功能,你怎么能指望它解决你的问题呢?

或者您只是想看看staticmethod做什么?在这种情况下,阅读文档来了解它的功能可能会更有效率,而不是随意地应用它并试图从行为中猜测它的功能。

在任何情况下,将@staticmethod应用于类中的函数定义都会形成一个"静态方法"。不幸的是,"静态"是编程中最容易混淆的重载术语之一;这里的意思是方法不依赖于或改变对象的状态。如果在类Bar中定义了静态方法foo,那么调用bar.foo(...)(其中bar是类Bar的某个实例)将执行完全相同的操作,而不管bar的属性包含什么。实际上,当我甚至没有实例的时候,我可以直接从类中调用它为Bar.foo(...) !

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

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