【问题标题】:How to properly use static methods?如何正确使用静态方法?
【发布时间】:2014-05-27 11:41:57
【问题描述】:

来自 C++,我无法使用静态成员方法。

class Color():
    def __init__(self):
        print ("red")

    @staticmethod
    def cl(val):
        return float(val / Color.colorConstant)

    red = (Color.cl(1.0), 0.0, 0.0)
    green = (0.0, 1.0, 0.0)
    blue = (1.0, 0.0, 1.0)
    purple = (1.0, 0.0, 0.0)
    colorConstant = 255

我收到错误:name 'Color' is not defined # on line 9

red = (Color.cl(1.0, 0.0, 0.0))

这段代码应该正常工作吗?我想在定义成员属性的时候调用一个静态方法。

【问题讨论】:

  • 您的代码在您的帖子中是否正确缩进?
  • 错误是在red = (Color.cl(1.0), 0.0, 0.0)这一行还是return float(val / Color.colorConstant)这一行?
  • 我现在编辑了缩进。 @MaximeLorant。它与 ''red = (Color.cl(1.0), 0.0, 0.0)'' 一致
  • 您使用的是哪个版本的 Python?
  • 当我运行你的代码时,我得到一个不同的错误:AttributeError: class Color has no attribute 'colorConstant'

标签: python static static-methods


【解决方案1】:

您尝试做的事情不会奏效。原因是 Python 解析名称的方式以及您定义的类型何时分配给名称。在您的示例中,您正在使用名称 Color 定义类型。在定义过程中,即class内的所有东西,名称Color尚未设置,因此Python无法解析名称。这就是为什么从它自己的定义中访问Color 是行不通的。

你可以这样想这个过程:

class <SomeAnonymousTypeName>:
    method and member definitions
Color = <SomeAnonymousTypeName>

所以只有定义之后,才分配类型名称。

相反,您必须在不引用类型的情况下进行定义。您还可以在定义类型之后动态添加常量

class Color:
    …

Color.red = …
Color.green = …

【讨论】:

  • 但是当我创建一个静态成员函数时,它应该已经可用了?
  • 不在 Python 中。 staticmethod 装饰器只会以某种方式调整您定义的方法,使其无需对象即可调用。但是没有像你从 C 中知道的那样“真正的”静态成员。它仍然是一种在运行时评估的动态语言。
  • 好的,这解决了我的问题,还有其他创建预定义颜色类的建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2019-03-31
相关资源
最近更新 更多