the best richard mille watch replica in the world qualified a watchmaker to use decade.

normal fingers in making often is the components involved with best swiss replicas relojes.
rolex replica helps to make some time one of a kind combined with wonderful.

check prices & features of replicas de relogios online.

はじめに

Pythonのことをもっと深く知りたいですか?
Pythonは動的言語なので、非常に柔軟な処理が可能です。
そのひとつが、属性の動的な操作です。
やや特殊な内容ですが、プログラミングで使うかどうかは別として、Pythonの舞台裏を知ることができます。
とても興味深い内容なので、ぜひご自分でも試してみて下さい。
この記事では、Python初心者の方向けに、Pythonの属性の動的な操作について解説していきます。
Pythonの動的な世界に足を踏み入れてみましょう。

そもそも属性ってなに?

属性とは、オブジェクトに存在する変数やメソッドのことを指します。
属性は、名前と値を持っており、双方が関連づいています。
これはディクショナリに似ています。
たとえば、変数なら変数名と変数値を持っていますし、メソッドならメソッド名とメソッド本体を持っています。
つまり、Pythonのプログラムはオブジェクトと属性の集合体と考えることもできます。

Pythonではすべてがオブジェクト

Pythonでは、すべてがオブジェクトとして定義されています。
たとえば、クラス自体もオブジェクトですし、メソッドや関数もオブジェクトとして定義されています。
これはつまり、クラスなども変数に割り当てられるということです。
具体的には、クラスはtypeクラスのインスタンスです。
これは、次のようなコードで確認できます。
例:

class Hello:
      name = "Anonymous"
      def say(self):
            print("Hello,
{0}".format(self.name))
print(type(Hello))

 
type関数を使うと、そのオブジェクトの型を調べることができます。
この例では、type関数にHelloクラスを渡して型を出力しています。
<class ‘type’>と出力されることから、Helloクラスはtypeクラスのインスタンスであることがわかります。
このため、typeクラスのコンストラクタを使って、新しいクラスを動的に定義することもできます。
次の例をみて下さい。
例:

def say(self):
      print("Hello, {0}".format(self.name))
Hello = type("Hello", (), {"name":
"Anonymous", "say": say})
hello = Hello()
hello.name = "Taro"
hello.say()

 
typeクラスのコンストラクタには、第一引数としてクラス名、第二引数として継承するクラスのタプル、第三引数として属性のディクショナリを渡します。
この例では、name変数とsayメソッドを持ったHelloクラスを動的に定義しています。
やっていることは先程の例とあまり変わりませんが、クラス構文を使わなくてもクラスを生成できるのは興味深いですね。
次は、オブジェクトの属性を動的に操作してみましょう。

オブジェクトの属性を動的に操作する

まずは、属性を操作する対象となるオブジェクトを用意する必要があります。
次のように、空のクラスを定義して、そのインスタンスに対して操作を行っていきましょう。
例:

class Container: pass

 
Pythonでは、ブロックが空の場合にはpassキーワードを記述しなければ構文エラーになります。
次に、このクラスのインスタンスに対して属性の動的な操作を行ってみましょう。
例:

c = Container()
setattr(c, "attr", "value")
print(getattr(c, "attr"))
delattr(c, "attr")

 
例のように、属性の追加はsetattr関数、取得はgetattr関数、削除はdelattr関数で行えます。
もちろん文字列だけでなく、メソッドなどでも同様のことが可能です。
次に、オブジェクトに存在する属性を一覧表示する方法をみてみましょう。

オブジェクトの属性を一覧表示してみよう

動的に属性を追加するということは、実行時に属性の名前を知る必要があるということです。
それには、次のようにPythonが定義する特殊な変数にアクセスします。
例:

class Container: pass
c = Container()
setattr(c, "attr", "value")
setattr(c, "add", lambda x, y: x + y)
for name, value in c.__dict__.items():
     print("{0}: {1}".format(name, value))

 
変数__dict__は、属性の名前と値がペアになったディクショナリです。
通常のディクショナリと同じく、for文を使ってイテレーションすることができます。
実行すると、定義したattr属性とadd属性が出力されることが確認できますね。

まとめ

Pythonでは、すべてものがオブジェクトです。
オブジェクトには、変数やメソッドなどのさまざまな属性があり、それもまたオブジェクトです。
Pythonの深層を知るために、いろいろなオブジェクトに存在する属性をみてみるのも面白いでしょう。
好奇心こそがプログラミングを上達させるカギです。
気になることは自分で調べてみて、どうなっているのか解明してみましょう。