1

我试图弄清楚如何将定义函数放在类内的定义函数中。我想做的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 等?

4

5 回答 5

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() 吗?一些优雅的想法,因为它不是在其他方面,比如在简单方面。

于 2012-12-05T05:16:51.050 回答
1

这是一种糟糕的编码方式......

没有办法在left下面调用函数,Guy class因为它在move函数的范围内,并且与 不同class的是,在另一个函数中添加一个函数不会使其成为它的属性。

在内部函数是外部函数的属性之前,无法使用封闭函数的名称来调用它

如果

def move():
    def left():

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

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

您应该寻找类似 anested class和 makemove作为 aclass而不是函数

于 2012-12-05T05:14:15.823 回答
1

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

move的方法每次调用时都会重新编译这些定向方法,并且这些定向方法只能从内部调用move

也许您想要一个move带有方向参数和 self 的通用方法?

def move(self, direction):
    if direction == "left":
        pass //do something
    //etc
于 2012-12-05T05:14:23.257 回答
0
class Guy():
    def move(self,dir):
       def left():
          print "left!"
       {'left':left}[dir]()

Guy().move("left")

会工作,虽然我没有看到太多的用例......

于 2012-12-05T05:30:53.617 回答
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

于 2012-12-05T05:37:01.577 回答