私は車両配線問題の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_type
のcapacities
に影響を与えた理由を私は理解していません。 Vehicle
はVehicleType
から直接継承されず、私はをVehicle
クラス内に定義しました。これはまた、約__getattr__
the docsの私の理解と矛盾:属性検索が 通常の場所(すなわち内の属性を発見していないときには、インスタンスの属性ではありませんもそれは自己のために クラスツリーで発見され呼び出され
)。 nameは属性名です。
誰かが、van_type
というインスタンスもここでも影響を受ける理由を説明していただけますか?
この驚きの部分は何ですか?あなたは 'van_type'が' capacity'を持っていることに驚いていますか?それが突然変異したことに驚いていますか? – user2357112
@ user2357112あなたは正しいです、私はあまりにも長く見えるからリンクを逃した。 'Vehicle'の' capacity'には '__getattr__'が必要です。その場合、 'Vehicle'の中で' capacity 'を定義し、残りの属性に対して '__getattr__'を使う唯一の方法です。 – roganjosh
@roganjosh ** **は一致します。もしそうでなければ、あなたのMCVEは間違っています。 – wim