【发布时间】:2013-10-04 14:37:59
【问题描述】:
检查以下我们实现nested classes 和混合staticmethods 的示例工作代码。
import time
class A:
def __init__(self):
time.sleep(0.1)
def a1(self):
print 'a1'
@staticmethod
def a2():
print 'a2'
class B:
@staticmethod
def b2():
A.a2() #fine.
A().a1() #very bad solution, computation cost is high !!!
@staticmethod
def x():
t = time.clock()
for i in xrange(100):
A.B.b2()
print 'elapsed: %0.1fs'%(time.clock()-t)
用作:
A.B.x()
上述方法有效,但正如您可能注意到的那样,对于 A().a1() 行,我们尝试从容器类 A 访问非静态方法 a1,计算成本太高。我们通过在A 初始化中使用sleep 来强调这一点。所以你明白了,它可以是任何耗时的初始化,这在我们的工作中是必要的,例如。所以我们不相信在上述行中实例化类A 是一个不错的选择。如何不在上面实例化A,但要像上面一样完成工作。尽管相关问题包括this 和that,但上述问题已在任何地方得到解答。
编辑:
我们对why use it 等建议不感兴趣。正如上面明确指出的,我们感兴趣的问题是如何改进这一行
A().a1()
就是这样。
根据Martijn Pieters给出的建议,通过以下方式解决。由于显示了解决方法,我们接受了答案。
class B:
@staticmethod
def b2(Ai):
A.a2() #fine.
if Ai is None: Ai = A()
Ai.a1() #now is fine.
@staticmethod
def x():
t = time.clock()
Ai = A()
for i in xrange(100):
A.B.b2(Ai=Ai)
print 'elapsed: %0.1fs'%(time.clock()-t)
谢谢。
【问题讨论】:
-
对不起,什么?您想在不实例化
A的情况下执行需要A实例的代码? -
我完全不清楚你在问什么,但是嵌套静态方法的行为与非嵌套静态方法没有任何不同。没有额外的性能损失(除了属性查找,这并不完全昂贵)会使情况变得异常。
-
@MartijnPieters 请注意,在上面的代码中,我们正在寻找一种解决方案不实例化
A百万次,只是为了访问方法a1。应该以某种方式仅对一个实例执行此操作。 -
如果
A需要很长时间来初始化,那么只做一次,缓存实例。你可以通过一个非常简单的__new__方法来做到这一点。 -
那只是缓存问题;与静态方法或嵌套对象无关。
标签: python class nested static-methods