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 classmoveclass

内部関数が外部関数の属性になるまで、それを囲む関数の名前を使用して呼び出す方法はありません。

万一に備えて

def move():
    def left():

つまり、関数内に関数が1つしかない場合は、関数から戻ることleft()ができmoveます。

ただし、この場合、move関数スコープ内に複数の関数があります。

aのようなものを探して、関数ではなくnested class作成する必要がありますmoveclass

于 2012-12-05T05:14:15.823 に答える
1

メソッドと関数をネストすることは避けます。

メソッドmoveは、呼び出されるたびにこれらの指向性メソッドを再コンパイルします。これらの指向性メソッドは、内からのみ呼び出すことができますmove

moveおそらく、自分自身と一緒に方向引数を取るジェネリックメソッドが必要ですか?

def move(self, direction):
    if direction == "left":
        pass //do something
    //etc
于 2012-12-05T05:14:23.257 に答える
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 に答える
0
class Guy():
    def move(self,dir):
       def left():
          print "left!"
       {'left':left}[dir]()

Guy().move("left")

使用例はあまり見られませんが、機能します...

于 2012-12-05T05:30:53.617 に答える