2017-04-11 5 views
0

私は車両配線問題のJavaライブラリのAPIを複製しようとしていますが、Pythonクラスについてはわかりません。__getattr__は、継承されていないクラスのインスタンスを予期せずに更新します

車両の艦隊は、2つの基本的な基準に分類できます。最初はあなたが所有する車両のタイプ(容量、ランニングコストなどを定義するためにVehicleTypeのインスタンス)と個々の車両(異なるシフトパターンなどのVehicle)です。私の簡単な例で

、私は、コンストラクタに渡されたVehicleTypeの属性を取り1 VehicleTypeして、単一Vehicleを定義したいです。 Lennart hereの回答に続いて、__getattr__を使用すると、一般的なケースで完全に機能します。しかし、50台中1台のドライバーが危険な物を運ぶ特別な資格を持っていると想像してください。Vehicleインスタンスに追加の容量プロパティを追加します。私は、次のことを試してみました:

class VehicleType(object): 

    def __init__(self, fixed_cost=0, cost_per_distance=0, cost_per_time=0): 
     self.capacities = {} 
     self.fixed_cost = fixed_cost 
     self.cost_per_distance = cost_per_distance 
     self.cost_per_time = cost_per_time 

    def add_capacity_dimension(self, dimension_id, dimension_size): 
     """ Define a package type and how many of them this vehicle type can carry """ 
     self.capacities[dimension_id] = dimension_size 


class Vehicle(object): 

    def __init__(self, vehicle_type=None, identifier=None): 
     self._vehicle_type = vehicle_type 
     self.identifier = identifier 

    def add_capacity_dimension(self, dimension_id, dimension_size): 
     self.capacities[dimension_id] = dimension_size 

    def __getattr__(self, name): 
     return getattr(self._vehicle_type, name) 


if __name__ == '__main__': 
    van_type = VehicleType() 
    van_type.add_capacity_dimension("general items", 34) 

    special_van = Vehicle(vehicle_type=van_type) 
    special_van.add_capacity_dimension("hazardous chemicals", 50) 

    print("Capacities of special van: {}".format(special_van.capacities)) 
    print("Capacity of van_type:  {}".format(van_type.capacities)) # Why? 

私のアプローチもvan_typecapacitiesに影響を与えた理由を私は理解していません。 VehicleVehicleTypeから直接継承されず、私はをVehicleクラス内に定義しました。これはまた、約__getattr__the docsの私の理解と矛盾:属性検索が 通常の場所(すなわち内の属性を発見していないときには、インスタンスの属性ではありませんもそれは自己のために クラスツリーで発見され呼び出され

)。 nameは属性名です。

誰かが、van_typeというインスタンスもここでも影響を受ける理由を説明していただけますか?

+0

この驚きの部分は何ですか?あなたは 'van_type'が' capacity'を持っていることに驚いていますか?それが突然変異したことに驚いていますか? – user2357112

+0

@ user2357112あなたは正しいです、私はあまりにも長く見えるからリンクを逃した。 'Vehicle'の' capacity'には '__getattr__'が必要です。その場合、 'Vehicle'の中で' capacity 'を定義し、残りの属性に対して '__getattr__'を使う唯一の方法です。 – roganjosh

+0

@roganjosh ** **は一致します。もしそうでなければ、あなたのMCVEは間違っています。 – wim

答えて

2

Vehicleインスタンスには「容量」属性がありません。 special_vanVehicle.add_capacity_dimension実装内から)上の

self.capacities属性検索は、カスタム__getattr__を経て、ないVehicleではなくVehicleTypeに解決されます。

したがって、special_van.capacitiesvan_type.capacitiesは同じです。

関連する問題