如何在define函数中放置一个define

时间:2012-12-05 05:07:00

标签: python pygame function

我试图弄清楚如何将一个define函数放在一个类里面的define函数中。我想做的Python代码:

class Guy():
    def move(self):
        def left(self):
            //compute
        def right(self):
            //compute
        def up(self):
            //compute
        def down(self):
            //compute

然后可以在程序中调用Guy.move.right()。解释器给我一个错误,说'功能没有属性'或类似的东西。有没有办法做到这一点,而不必将我的功能移出移动功能,并称他们为Guy.right,Guy.left等?

5 个答案:

答案 0 :(得分:2)

函数通常不具有它们向外部作用域公开的字段和其他函数。这通常是对象的工作。但你可以用......之类的东西来做。

class Guy():
    class Move():
        def __init__(self):
            self.whatevs = "whatevs"
        def left(self):
            print("left")
            pass
            #compute
        def right(self):
            print("right")
            pass
            #compute
        def up(self):
            print("up")
            pass
            #compute
        def down(self):
            print("down")
            pass
            #compute

    def __init__(self):
        self.move = self.Move()

guy = Guy()
guy.move.left()

我很确定这不是好设计。你有没有理由想做guy.move.left()?一些优雅的想法,因为它不是在其他方面,例如在简单方面。

答案 1 :(得分:1)

这是一种不好的编码方式......

无法在left下调用Guy class函数,因为它位于move函数的范围内,与class不同,在另一个函数中添加函数会不要把它作为它的属性。

在inside函数是外部函数的属性之前,没有办法使用封闭函数的名称来调用它

以防

def move():
    def left():

即。如果函数内只有一个函数,则从left()函数返回move是可行的。

但是在这种情况下,move函数范围内有多个函数。

你应该寻找像nested class这样的东西,并将move作为class而不是函数

答案 2 :(得分:1)

我会避免嵌套方法和函数。

您的move方法将在每次调用时重新编译这些方向方法,并且只能从move内调用这些方向方法。

也许你想要一个通用的move方法,它带有一个方向参数和自我?

def move(self, direction):
    if direction == "left":
        pass //do something
    //etc

答案 3 :(得分:0)

class Guy():
    def move(self,dir):
       def left():
          print "left!"
       {'left':left}[dir]()

Guy().move("left")

会工作,虽然我没有看到它的大量用例...

答案 4 :(得分:0)

有一种方法可以完成类似于原始代码的要求: Guy.move()将调用move()函数,Guy.move.right(Guy())将调用move.right函数。唯一的区别是我必须明确地将self对象传递给move.right。

我不鼓励任何人采取这种方式,更像是'什么是python可以做'的事情。

def to_attr(f):
    import inspect
    import new
    for c in f.func_code.co_consts:
        if inspect.iscode(c):
            g = new.function(c, globals())
            setattr(f, g.func_name, g)    

    return f

class Guy(object):
    @to_attr
    def move(self):
        def left(self):
            pass
        def right(self):
            print "Right"
        def up(self):
            pass
        def down(self):
            pass
        print "Move"

Guy.move.right(Guy())
Guy().move()

inspect代码来自Introspecting a given function's nested (local) functions in Python