__getitem__
まず、これがシンタックス シュガーであることを理解する必要があります。あると便利ですが、必要ない場合は使用しないでください。__getitem__
基本的に__setitem__
は、次のようなブラケット表記を使用してオブジェクトからアイテムにアクセスできるようにしたい場合です。
p= Particle(foo)
bar = p[0]
これが必要ない場合は、心配しないでください。
さて、他のすべてに。あなたのオブジェクトがあなたの__init__
定義で持ち歩きたい主な特徴を持っているように見えますが、それは問題ありません。次に、以下を使用して、これらの値を実際にオブジェクトにバインドする必要がありますself
。
class Particle:
def __init__(self, mass, position, velocity, force):
self.mass = mass
self.position = position
self.velocity = velocity
self.force = force
それは本当にそれです。次のように、ドット表記を使用してこれらの値にアクセスできるようになりました。
mass,pos,vel,f = 0,0,0,0 # just for readability
p = Particle(mass,pos,vel,f)
print p.mass, p.position, p.velocity, p.force
ここから得られる良い点の 1 つは、Python に何を尋ねると、次のように、それが型p
のインスタンスであると教えてくれることです。Particle
in [1]: p
out[1]: <__main__.Particle instance at 0x03E1fE68>
理論的には、このようなオブジェクトを操作する場合、ユーザーとデータの間に「抽象化レイヤー」を配置して、データに直接アクセスしたり操作したりしないようにする必要があります。__getitem__
これを行うには、クラスメソッドを介してユーザーとデータ間の対話を仲介する関数を作成します ( でやろうとしたように)。これは便利ですが、多くの場合必要ありません。
より単純なケースでは、これらの属性の値を更新するには、ドット表記を使用して、アクセスしたのと同じ方法で直接行うことができます。
in [2]: p.mass
out[2]: 0
in [3]: p.mass = 2
in [4]: p.mass
out[4]: 2
あなたはすでにこれを理解しているかもしれませんが、__init__
関数やclass
定義(通常、クラスの属性とメソッドのほとんどを定義する/定義する必要がある場所)について魔法のようなものは何もありません。特定の種類のオブジェクトは、いつでもどこでも好きなときに属性を追加できるようにすることについてかなり寛容です。これは便利かもしれませんが、一般的に非常にハックであり、良い習慣ではありません。これを行うことを提案しているわけではなく、それが可能であることを示しているだけです。
in [5]: p.newattr ='foobar!'
in [6]: p.newattr
out[6]: 'foobar!'
変ですよね?これがあなたの肌を這わせるなら...まあ、そうすべきかもしれません. しかし、それは可能であり、あなたができることとできないことを言うのは誰ですか. これが、クラスの仕組みの一部です。