1

これは非常に単純な質問だと思いますが、適切な答えが見つからないようです。基本的に、simulationという名前のクラスから呼び出される関数のリストがあります。

simulation.addGroup("teapotarmy")
simulation.populateGroup(20)
simulation.addNode("input",INPUT)
simulation.addNode("output",OUTPUT);
simulation.connectNodes("input","output");
simulation.manipOutputNode("output", "group.xvel");
simulation.manipInputNode("input", 1, 0.05);

毎回クラス名を繰り返さずにこれらの関数を呼び出す方法はありますか?次のようなもの:

(thethingIwant) simulation:
    addGroup("teapotarmy")
    populateGroup(20)
    addNode("input",INPUT)
    ...

私は他のプログラミング言語でこれを行いましたが、Pythonの構文を理解していません。'with'ステートメントと関係があることをかすかに覚えています...?前もって感謝します。

レオン

4

4 に答える 4

6

単純に、いいえ。これを行う方法はありません(良い、最後の私のコメントを参照してください)。あなたができる最善のことは、それを別のより短い名前に割り当てることです:

s = simulation
s.addGroup("teapotarmy")
...

これはそれほど悪くはありませんが、通常の方法の方が読みやすいと思います。

補足として、これができないというのは厳密には真実ではありません。プログラムですべてのシミュレーション方法をローカル名前空間に割り当てることもできますが、これに従うのはかなり混乱するので、お勧めしません。

例:

from contextlib import contextmanager
import inspect

class some_class:
    def test(self):
        print("test!")

@contextmanager
def map_to_local(inst, locals):
    methods = inspect.getmembers(inst, inspect.ismethod)
    for name, method in methods:
        locals[name] = method
    yield
    for name, method in methods:
        del locals[name]

inst = some_class()
with map_to_local(inst, locals()):
    test()

これはかなり壊れやすいことに注意してください。値を上書きしていないことを確認したり、コンテキストマネージャが終了する前に値が削除されていないことを確認したりするなど、注意が必要です。何が起こっているかもかなり不明確です。

tl; dr:はい、可能です、いいえ、あなたはそれをすべきではありません。現在のコードは問題なく明確です。

于 2012-12-02T18:15:07.057 に答える
2

現在設計されている既存のクラスを操作するには、通常の解決策は、より短い変数名を使用することです。

s = simulation
s.addGroup("teapotarmy")
s.populateGroup(20)
s.addNode("input",INPUT)
s.addNode("output",OUTPUT)
s.connectNodes("input","output")
s.manipOutputNode("output", "group.xvel")
s.manipInputNode("input", 1, 0.05)

とはいえ、別の解決策は、これらのメソッドが自分自身を返すようにクラスを少し変更することです。次に、次のように書くことができます。

(simulation
    .addGroup("teapotarmy")
    .populateGroup(20) 
    .addNode("input",INPUT)
    .addNode("output",OUTPUT)
    .connectNodes("input","output")
    .manipOutputNode("output", "group.xvel")
    .manipInputNode("input", 1, 0.05))

通常のPythonスタイルでは、ミューティングメソッドがNoneを返します(ミューテーションが発生したというヒントを提供するため)。ただし、一連の変換と状態更新を適用するのが一般的である、あなたのようなAPIでは自己を返すことが一般的です。

于 2012-12-02T19:58:27.110 に答える
1

私が考えることができる最も近いことは、Pythonの関数がクラスの属性(呼び出し可能な属性)でもあるという事実を利用することです。そのため、名前でそれらを「取得」して呼び出すことができます...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Simulation(object):
  def addGroup(self, groupToAdd):
    print "Group to add: %s" % groupToAdd

  def addNode(self, inputType, inputChannel):
    print "My inputs: %s, channel: %s" % (inputType, inputChannel)

if __name__ == "__main__":
  simulation = Simulation()
  functionsToCall = [
      ("addGroup", "teapotarmy"),
      ("addNode", "input", "INPUT"),
    ]
  for functionToCall in functionsToCall:
    getattr(simulation, functionToCall[0])(* functionToCall[1:])

しかし、これにより、コードが以前よりも混乱する可能性があります。他の誰かがあなたのコードを変更しなければならない場合、それは彼の仕事を複雑にするかもしれません...かなり。:)

詳細情報:Callablesパッキングパラメータ

于 2012-12-02T18:23:41.573 に答える
1

クラスで定義するメソッドごとに、selfオブジェクトを返すことができます。

class schema:
    def __init__(self,name,age):
        self.name = name 
        self.age = age
    def giveName(self):
        print(self.name)
        return self
    def giveAge(self):
        print(self.age)
        return self

obj = schema(name="yo",age=15)
obj.giveName().giveAge()
于 2020-09-30T03:45:18.603 に答える