2017-02-11 4 views
1

JavaScriptのObject.create()機能と同等のPythonは何ですか?JavaScriptのObject.create()のPythonに相当します。

例えば、JSでこれが可能である:それは作品

s = { 'pots': 5, 'cups': 2 } 
t = copy.copy(s) 

が、新しいを作成するのは非常に無駄なようだ:

var s = { 'pots': 5, 'cups': 2 }; 
var t = Object.create(s); 
console.log(t['pots']);    // 5 

t['pots'] = 9000; 
console.log(t['pots']);    // 9000 
console.log(t['__proto__']['pots']); // 5, unchanged 

s['pots'] = 33; 
console.log(t['pots']);    // 9000, unchanged 
console.log(t['__proto__']['pots']); // 33 

私はcopyを使用していると考えることができます最も近いものそのプロパティを継承するたびに参照オブジェクトのコピーを作成します。

また、クラスインスタンスではなく、上記のタイプの単純なオブジェクトで作業しています。

+0

「単純オブジェクト」とクラスインスタンスは区別されません。すべてのオブジェクトは同じように動作します。 Pythonはプロトタイプベースの継承ではなく、クラスベースの継承を使用します。 –

答えて

3

辞書クラスdictは、そのコンストラクタで別の辞書を受け入れます。

s = { 'pots': 5, 'cups': 2 } 
t = dict(s) 

これは浅いコピーで、不変のオブジェクトを値として使用している場合に適しています。 (キーは常に不変型でなければなりません)。値として他の辞書(リストやその他のさまざまな型)などの可変コンテナを使用している場合は、copy.deepcopy()を使用してください。

Pythonでは、コンテナ内の項目(dictなど)とオブジェクトの属性は完全に異なるものであり、異なる方法でアクセスされ、どちらもJavaScriptのプロパティと似ていないことに注意してください。あなたが実際にやろうとしていることは、より良いPythonでのクラスによって達成される:あなたが実際にs.potsを割り当てるまで、この場合

class Thing(object): 
    pots = 5 
    cups = 2 

s = Thing() 
t = Thing() 

s.potsは、その属性の時点でのインスタンスの値、Thingクラスに格納された値にアクセスしますクラスに格納されている値をシャドウします。実際に割り当てられた属性に対してのみ、インスタンス上でスペースが使用されます。

クラスに__slots__を定義して、特定の名前の属性のみを割り当てることもできます。これはインスタンスのメモリオーバーヘッドを減らすことができます。インスタンスのメモリオーバーヘッドを減らすことができます。

ドット表記ではなく変数(または式)を使用して属性にアクセスするPythonの方法は、getattr()関数です。 .または[]のいずれかを使用して同じデータにアクセスできるオブジェクトを作成することは可能ですが、JavaScriptの場合のように正確にのように動作することが予想されるよりも扱いにくいです。あなたがする方法を提供することができ

t = type(s)() 
t.__dict__.update(s.__dict__) 

あなたはクラスを使用している、あなたの例に最も近い同等はこのようなものである(s与えられ、tsさんとの独自の属性を作成します)この:

class Cloneable(object): 
    def clone(self): 
     inst = type(self)() 
     inst.__dict__.update(self.__dict__) 
     return inst 

その後CloneableではなくobjectからThingを導出し、あなたが行うことができます。

s = Thing() 
t = s.clone() 
+0

hh。私はこの視点が好きです。 Upvoted。 –

関連する問題