2011-07-27 7 views
1

JavaScriptでは、私はこれを行うことができます。PythonのJavascript形式のオブジェクトメソッド?

person.speak() 
'o hai i am joe' 

私はこれは、Pythonのクラスで行うことができ、そしておそらくそれは行くための正しい方法を知っている:

var person = { 
    name: 'Joe', 
    age: '35', 
    speak: function(){ 
    return 'o hai i am joe' 
    } 
} 

は、それから私は、そのメソッドを呼び出すことができます。

しかし、私は興味があります - Python辞書に値として関数を追加する方法はありますか?

+1

javascriptのバージョンではそれ以上のことがあり、オブジェクト全体を定義します。一括してまとめた値や関数(後者にアクセスできない)だけでなく、Pythonで実際のオブジェクトが必要な場合は、クラスを記述する必要があります。 – delnan

答えて

5
person = { 
    'name': 'Joe', 
    'age': '35', 
    'speak': lambda: 'o hai i am joe', 
} 

しかし、Pythonでは(JavaScriptとは異なり)、属性と[]アクセスが異なります。話すを実行するには、次のことができ

person['speak']() 
2
def test(): 
    print "hello" 

testDict = {"name" : "Joe", "age" : 35, "speak" : test} 

testDict["speak"]() 
0

を書き、どちらか先に時間の関数を定義することにより:(簡単な返品の場合には)ラムダを使用して

def speak_function(txt): 
    print txt 

person = { 
    'speak': speak_function 
} 

または可能性:

person = { 
    'speak': lambda x: x 
} 
+0

戻り値は、その暗黙的なlambdasでは無効です。 – phihag

+0

@phihag - ありがとう!良いキャッチ。 –

2

javascriptとpythonの主な違いの1つは、メソッドの名前空間でのターゲットオブジェクトの処理です。 javadocでは、というメソッドがで、Pythonではselfがクラス作成時間(関数をインスタンスメソッドに変換する)と属性にアクセスする(インスタンスメソッドのim_selfプロパティをバインドする)組み合わせで決定される場合、必要に応じてthisが設定されます)。属性アクセスのみを使用する場合でも、インスタンスメソッドをクラスではなく個々のインスタンスにバインドする場合は、この違いを克服するのはややこしいことです。

import functools 
class JSObject(object): 
    def __getattribute__(self, attr): 
     """ 
     if the attribute is on the instance, and the target of that is 
     callable, bind it to self, otherwise defer to the default getattr. 
     """ 
     self_dict = object.__getattribute__(self, '__dict__') 
     if attr in self_dict and callable(self_dict[attr]): 
      return functools.partial(self_dict[attr], self) 
     else: 
      return object.__getattribute__(self, attr) 

ここではアクションである:dictもう少し好きな上記のクラスを作る

>>> foo = JSObject() 
>>> foo.bar = 'baz' 
>>> foo.bar 
'baz' 
>>> foo.quux = lambda self: self.bar 
>>> foo.quux 
<functools.partial object at 0x7f8bae264ba8> 
>>> foo.quux() 
'baz' 

は、エミュレートするために、別の問題であり、私の意見では、ないのJavaScriptの最良の「機能」で、私たちが "とにかく"したいと思ったら、おそらくdictをサブクラス化し、もう一度__getattr__または__getattribute__をオーバーロードすることから始めます。これは私が練習として残すものです。

+0

これは魅力的です、ありがとう。私は 'functools'を見たことがなかった。 –