如何从静态方法(如this one和that 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
,则会发生同样的错误。
是否可以从类变量访问静态方法?
答案 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')
虽然这对我来说最有效,但更多的是解决问题而非答案。