0

检查以下我们实现nested classeswith mixed的示例工作代码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()访问非静态方法的行,计算成本太高。我们通过初始化来强调这一点。所以你明白了,它可以是任何耗时的初始化,这在我们的工作中是必要的,例如。所以我们不相信在上述行中实例化类是一个好的选择。如何不在上面实例化,但要像上面一样完成工作。尽管相关问题包括thisthat ,但上述问题已在任何地方得到回答。a1AsleepAAA

编辑
我们对诸如此类的建议不感兴趣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)

谢谢你。

4

1 回答 1

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() 如果您想重用for 循环的实例,请将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()

现在实例在 function 期间被缓存x()

于 2013-09-28T09:38:22.820 回答