使用混合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()
访问非静态方法a1
的行A
,计算成本也是如此高。我们在sleep
初始化中A
强调了这一点。所以你明白了,例如,在我们的工作中,它可能是任何耗时的初始化。因此,我们不相信在上述行中实例化类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)
谢谢。
答案 0 :(得分:2)
您的问题与静态方法或嵌套类无关。全局函数存在完全相同的问题:
class A:
def __init__(self):
time.sleep(0.1)
def a1(self):
print 'a1'
def a2():
print 'a2'
def b2():
a2()
A().a1()
def x():
t = time.clock()
for i in xrange(100):
b2()
print 'elapsed: %0.1fs'%(time.clock()-t)
调用x()
仍会导致在A()
之外的循环中创建昂贵的b2()
实例。
您需要设计一个用于创建A()
的缓存策略。有太多的方法可以在这里总结,当然,关于重新使用A()
的实例是否可以接受创建新实例的信息很少。
如果您想在A()
中重复使用x()
的实例作为循环,那么将其作为可选参数传递:
def x():
t = time.clock()
instance = A()
for i in xrange(100):
b2(instance)
print 'elapsed: %0.1fs'%(time.clock()-t)
def b2(instance=None):
a2()
if instance is None:
instance = A()
instance.a1()
现在,实例在函数x()
的持续时间内被缓存。