例として、本明細書にPythonオブジェクト、メソッド、クラス、インスタンス、機能の使用状況の分析。ご参考のためにあなたに共有します。次のように具体的な分析は次のとおりです。
Pythonは完全にオブジェクト指向言語です。例としては唯一のオブジェクト、クラス、関数、メソッドもオブジェクトですされていません。
class Foo(object):
static_attr = True
def method(self):
pass
foo = Foo()
このコードは、実際には2つのオブジェクト、fooとFOOを作成しています。同時に、Fooクラスであるが、FOOは、このクラスのインスタンスです。
タイプ定義はコンパイル時にC ++で行われるスタティックメモリに記憶され、それは容易に変更することができません。Pythonの種類自体は対象となり、スタックに格納されたインスタンスは、オブジェクト、インタプリタは、オブジェクト・クラス・オブジェクトと基本的に異ならないのインスタンスのためのものです。
Pythonでは、すべてのオブジェクトは、独自の名前空間を持っています。スペース内の変数は、オブジェクトの__dict__に格納されています。したがって、Fooのクラスは__dict__を有し、FOOインスタンスも__dict__を有し、2つの異なる名前空間です。
いわゆる「クラスの定義は、」クラスのオブジェクトに実際に氏だった、その後、コードの一部が、クラスは、あなたがこのようなコードを書くことができるように__dict__のコードを実行するように設定されているローカル名前空間を実行します。
>>> class Foo(object):
... bar = 1 + 1
... qux = bar + 1
... print "bar: ", bar
... print "qux: ", qux
... print locals()
...
bar: 2
qux: 3
{'qux': 3, '__module__': '__main__', 'bar': 2}
>>> print Foo.bar, Foo.__dict__['bar']
2 2
>>> print Foo.qux, Foo.__dict__['qux']
3 3
いわゆる「関数の定義」には、実際には、関数オブジェクトを生成することです。生成「方法を定義」
オブジェクトの機能を、クラス__dict__にこのオブジェクトを。次の二つの定義は等価な方法ですフォーム:
>>> class Foo(object):
... def bar(self):
... return 2
...
>>> def qux(self):
... return 3
...
>>> Foo.qux = qux
>>> print Foo.bar, Foo.__dict__['bar']
>>> print Foo.qux, Foo.__dict__['qux']
>>> foo = Foo()
>>> foo.bar()
2
>>> foo.qux()
3
クラス継承は異なる__dict__をそれぞれ有する2つのクラスオブジェクトを定義するだけです。
>>> class Cheese(object):
... smell = 'good'
... taste = 'good'
...
>>> class Stilton(Cheese):
... smell = 'bad'
...
>>> print Cheese.smell
good
>>> print Cheese.taste
good
>>> print Stilton.smell
bad
>>> print Stilton.taste
good
>>> print 'taste' in Cheese.__dict__
True
>>> print 'taste' in Stilton.__dict__
False
代わりに、複雑な.
演算子に。クラスはスティルトンで、Stilton.taste手段」。であるために『味』をdict__に探しています。見つからない場合は、親__dict__チーズの行く、その後、親クラスの親、というように。あなたがオブジェクトに行ったことがある場合は、まだ発見されない、そして「はAttributeErrorを投げる。
例は、独自の__dictを持っています:
>>> class Cheese(object):
... smell = 'good'
... taste = 'good'
... def __init__(self, weight):
... self.weight = weight
... def get_weight(self):
... return self.weight
...
>>> class Stilton(Cheese):
... smell = 'bad'
...
>>> stilton = Stilton('100g')
>>> print 'weight' in Cheese.__dict__
False
>>> print 'weight' in Stilton.__dict__
False
>>> print 'weight' in stilton.__dict__
True
かどうかの__init __は()ここで、スティルトン.__ dict__にクラスの__dict__とは何の関係もない定義されています。
これら二つは、名前空間のインスタンスには触れていないので、Cheese.weightとStilton.weightは、間違って行きます。
検索順序stilton.weightはスティルトンである。辞書です =>スティルトン。辞書です =>
チーズ。辞書です =>オブジェクト。辞書です。これはちょうど、Stilton.taste順序を見て非常に似ている
以上のステップの前に。
この方法は少し複雑です。
>>> print Cheese.__dict__['get_weight']
>>> print Cheese.get_weight
>>> print stilton.get_weight
<__main__.Stilton object at 0x7ff820669190>>
私たちは、宇宙で直接通話機能やポイントに結合していないメソッドをという名前のクラスにドット演算機能を見ることができます。
操作の未結合の方法が異なるエラーで返されます。
>>> Cheese.__dict__['get_weight']()
Traceback (most recent call last):
File "", line 1, in
TypeError: get_weight() takes exactly 1 argument (0 given)
>>> Cheese.get_weight()
Traceback (most recent call last):
File "", line 1, in
TypeError: unbound method get_weight() must be called with Cheese instance as
first argument (got nothing instead)
それは2つのエラーを言うために一つのことである。しかし、インスタンスメソッドは、インスタンスが必要です。いわゆる「結合方法は、」単に最初のパラメータとしてオブジェクトのインスタンスへのメソッド呼び出しです。これらの呼び出し、次の方法は等価です
>>> Cheese.__dict__['get_weight'](stilton)
'100g'
>>> Cheese.get_weight(stilton)
'100g'
>>> Stilton.get_weight(stilton)
'100g'
>>> stilton.get_weight()
'100g'
最後に呼び出し、stilton.get_weight()と通常の方法で、stilton.get_weight(スティルトン)。翻訳他の特徴点オペレータ、stilton.get_weight()は
このように、メソッド呼び出しが実際に持っている2手順。まず、プロパティルールがパラメータとして関数呼び出しとしてget_weight、このプロパティ、およびオブジェクトの最初のインスタンスを見つけた見つけます。この2つのステップの間のリンクがありません。たとえば、あなたはこれを試すことができます。
>>> stilton.weight()
Traceback (most recent call last):
File "", line 1, in
TypeError: 'str' object is not callabl
このプロパティの重み、関数呼び出しのように体重を検索。しかし重量は、そう間違った文字列です。プロパティは、ここで注意すべきで検索すると、最初の例であります:
>>> stilton.get_weight = lambda : '200g'
>>> stilton.get_weight()
'200g'
しかし
>>> Stilton.get_weight(stilton)
'100g'
オブジェクトのStilton.get_weightルックスキップスティルトンのインスタンスは、それが、覆われていないチーズで定義された方法を発見されました。
GETATTR(スティルトン、 '重量')とstilton.weightは等価です。オブジェクトのClassオブジェクトのインスタンスと本質的な違い、GETATTR(チーズ、「匂い」が存在しない ) とCheese.smell同様に相当するものは。GETATTR()ドット演算子の利益と比較して、文字列指定された属性名があり、それは実行時に変更することができます。
getAttributeは()基礎となるコードです。あなたは、このメソッドは、オブジェクト。再定義していない場合のgetAttribute()とタイプを。のgetAttributeを()のgetattrは後者のクラスのために、前者の例のために、具体化されている()です。換言すれば、stilton.weightオブジェクト。あるのgetAttribute(スティルトン、「ウェイト」)。このカバーは、誤りがちです。例えば、ドット演算子は、無限再帰につながることができます:
def __getattribute__(self, name):
return self.__dict__[name]
getAttribute()、それは間違いを書き換えることは容易である場合には、そのような記述プロトコルを達成するなど、他の詳細は、あります。
GETATTR()メソッドが見つかりません__dict__ケースを見つけることで呼び出されます。__getattrは__()他の場所で定義されたプロパティ__dict__を置くために干渉しないので、一般的に動的に生成された属性は、これを使用します。
>>> class Cheese(object):
... smell = 'good'
... taste = 'good'
...
>>> class Stilton(Cheese):
... smell = 'bad'
... def __getattr__(self, name):
... return 'Dynamically created attribute "%s"' % name
...
>>> stilton = Stilton()
>>> print stilton.taste
good
>>> print stilton.weight
Dynamically created attribute "weight"
>>> print 'weight' in stilton.__dict__
False
メソッド、プロパティ、関数呼び出しとしてのみ可能であるので、GETATTR()メソッドは、動的に生成するために使用するだけでなく、無限再帰に注意を払うに持つことができます。
>>> class Cheese(object):
... smell = 'good'
... taste = 'good'
... def __init__(self, weight):
... self.weight = weight
...
>>> class Stilton(Cheese):
... smell = 'bad'
... def __getattr__(self, name):
... if name.startswith('get_'):
... def func():
... return getattr(self, name[4:])
... return func
... else:
... if hasattr(self, name):
... return getattr(self, name)
... else:
... raise AttributeError(name)
...
>>> stilton = Stilton('100g')
>>> print stilton.weight
100g
>>> print stilton.get_weight
>>> print stilton.get_weight()
100g
>>> print stilton.age
Traceback (most recent call last):
File "", line 1, in
File "", line 12, in __getattr__
AttributeError: age
、そして最終的に公共機関[プログラマ]の数では良い評判をお勧めする方法多くのより多くのコンテンツ、古いタイマー、スキルを学習体験、インタビューのスキル、職場体験や他のシェアを学習がたくさんある、より多くの我々は慎重に準備ゼロベース毎日、実際のプロジェクトデータの入門情報は、Pythonプログラマの技術のタイミングを説明、および方法は、細部に注意を払う必要があるいくつかの学習を共有します