我试图弄清楚如何将一个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等?
答案 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