2011-08-09 24 views
1

は、クラスのインスタンスを考えてみましょう:Pythonの実践:「参照」によって渡される引数

class Car(object): 
    def __init__(self): 
     self.engine = None 

とインスタンスという修正機能:

def add_engine(car): 
    car.engine = 'V6' 

Pythonがあることを指摘する暗黙の技術を持っていません引数が変更されます。

def add_engine(car): 
    car.engine = 'V6' 
    return car 

がどのようにこの設計上の問題を解決するだろう:私は考えることができる最高のソリューションは、(それが同じオブジェクトが引数として渡されますが)変更されたオブジェクトを返すことですか?

-

皆さん、ありがとうございます。あなたのアドバイスは私の頭の中の混乱をクリアするのに役立ちました:)

答えて

4

私はこれらのものを返す方法を作る傾向がありますself。それは

car = Car().add_engine().add_wheels() 

時々Pythonの標準ライブラリで使用されている他のオプション、のような構築物は、何も返されないことができます。それは混乱を防ぎ、破壊的な更新を使用するときにクライアントに不可欠なスタイルを強制することになっています。 list.sortsortedの例です。

選択肢はスタイルの1つで、周囲のコードとの一貫性の規則が適用されます。

+1

Downvoters、説明するように気をつけますか? –

2

私は完全に異なって、それを解決するだろう:

class Car(object): 
    def __init__(self): 
     self.engine = None 

    def set_engine(self): 
     self.engine = 'V6' 

規則はaddデータを追加していることです。 setは既存の状態を変更します。 @ larsmansが指摘しているように、車の復帰は魅力的な構成になっていますが、あなたの問題にはまったく対応していません。

2

PythonはC++、Java、C#などと似ていません。あなたは何でも好きなことをすることができます。あなたは何も私的にすることはできません。あなたはコンスタンスを強制することはできません。

Pythonのこれらの側面には利点と欠点がありますが、それはその方法です。静的にチェックできるものはほとんどないので、優れたカバレッジで、コードに対して非常に強いランタイムテストが必要です。完全なカバレッジを持つ強力なテストがなければ、Pythonでの開発はネコを放牧するようなものになることがあります。

0

あなたは__setattr__方法で割り当てる属性をオーバーライドすることができます:今car_modifiedはあなたが属性を設定するたびに呼び出されます

class Car(object): 
    def __init__(self): 
     self.engine = None 
    def car_modified(self, name): 
     #do whatever you want 
    def __setattr__(self, name, value) 
     self.__dict__[name] = value 
     self.car_modified(name) 

+0

これは、元の値を返すか値を返さないかの質問にどのように答えますか? –

+0

@larsmans、 "Pythonには、引数が変更されることを指摘する暗黙の手法はありません。"属性が割り当てられたときに通知を受け取ることができます。私はそれが質問の一部だと思う。 – utdemir

7

FWIW、私は、Pythonの世界では、副作用を持つ関数/メソッド(例えば、お求めのもの)が常にNoneを返すことに気付きました。 (これは暗黙のうちに、引数のないreturn文を使うか、単にreturnを省略して暗黙的に行われます。例えば)

は、この場合にはリストを適所にソートされるため、Noneを返すlist.sort方法で、新しいリスト(もちろん、ソートされた)を返すsorted組み込み関数を、比較します。同様の状況は、reversed組み込み関数とlist.reverseメソッドの場合に適用されます。

したがって、IMOは暗黙のうちにNoneを返すだけで、機能に副作用があることをユーザーに警告することができます(副作用なしで、常にNoneを返す関数は基本的にはno-op)を従来の「Pythonic」のやり方で実行します。

+1

+1しかし、私は票が足りません。これは@CatPlusPlusと同じ答えを与えるのに便利な方法です。これは、副作用を伴うPythonのメソッド/場所で動作することは絶対にあります。 – agf

関連する問題