从静态变量访问静态方法

时间:2015-05-11 15:16:11

标签: python python-2.7 static

如何从静态方法(如this onethat one访问静态变量,以及主题here上的精彩信息)有很多答案,但是我有另一方面的问题:如何使用静态方法初始化静态变量。 E.g:

import os, platform
class A(object):
    @staticmethod
    def getRoot():
        return 'C:\\' if platform.system() == 'Windows' else '/'
    pth = os.path.join(A.getRoot(), 'some', 'path')

最后一行给出了一个例外:NameError: name 'A' is not defined。如果我使用@classmethod而不是@staticmethod,则会发生同样的错误。

是否可以从类变量访问静态方法?

3 个答案:

答案 0 :(得分:5)

问题是,在声明变量路径时,类“A”尚不存在,因此评估失败。如何在之后宣布它?

import os, platform
class A(object):
    @staticmethod
    def getRoot():
        return 'C:\\' if platform.system() == 'Windows' else '/'
A.pth = os.path.join(A.getRoot(), 'some', 'path')

更丑陋的替代方案是:

import os, platform
class A(object):
    @staticmethod
    def getRoot():
        return 'C:\\' if platform.system() == 'Windows' else '/'
    pth = os.path.join(getRoot.__func__(), 'some', 'path')

...但它非常难以理解(并且取决于@staticmethod的实现细节,这很糟糕)。

对于这个特定的情况,我会做这样的事情(这并没有真正回答你的问题,而是回避了它的需要):

import os, platform
class A(object):
    _root = 'C:\\' if platform.system() == 'Windows' else '/'
    @staticmethod
    def getRoot():
        return A._root
    pth = os.path.join(_root, 'some', 'path')

...因为你的平台在程序运行时不太可能改变,对吧? :)如果你有更好的理由做这样的事情,可以使用上面的方法之一。

答案 1 :(得分:1)

您可以使用pth

推迟对classproperty的评估
class A(object):
    @staticmethod
    def getRoot():
        return 'C:\\' if platform.system() == 'Windows' else '/'
    @classproperty
    def pth(cls):
        return os.path.join(cls.getRoot(), 'some', 'path')

classproperty不是内置的,但它是一种广泛使用的配方。

作为旁注,恕我直言,您应该始终使用classmethod而不是staticmethod

答案 2 :(得分:-1)

我最终做的是A扩展了一个不同的类B,它具有我想要的静态方法。即:

import os
import platform

class B(object):
    @staticmethod
    def getRoot():
        return r'C:\\' if platform.system() == 'Windows' else '/'

class A(B):
    pth = os.path.join(B.getRoot(), 'some', 'path')

虽然这对我来说最有效,但更多的是解决问题而非答案。