Python静态方法,为什么?

可能重复:
Python中@staticmethod和@classmethod有什么区别?

我有几个关于类中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

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


你想用这种staticmethod实现什么? 如果你不知道它是什么,你如何期待它解决你的问题?

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

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

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

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

链接地址: http://www.djcxy.com/p/9169.html

上一篇: Python Static methods, why?

下一篇: Why use classmethod instead of staticmethod?