詳細はpythonメモリの最適化を解きます。


前に書く
類をめぐっては、話がつきません。特殊な方法だけで、前で会ったことのある_u u u uinit_()、_new_,_str()他にもたくさんあります。彼らはいくつかの特殊な場面でしか使えませんが、それらを習得すると、この言語に詳しい道の敷石になります。
だから私はいくつかの「黒の魔法」を紹介してみます。Pythoonの魅力をたくさん感じさせます。「芸が多くて身を抑えない」というのはこのことです。
メモリ最適化
まず、前のクラスの属性と実例的な属性を復習する知識から別の特殊な方法を引き出しましょう。

>>> class Sample:
...   name = 'rocky'
...
前の文章のように、各種類に一つずつあります。dict_()属性には、現在のクラスの属性が含まれています。

>>> Sample.__dict__
mappingproxy({'__module__': '__main__', 'name': 'rocky', '__dict__': <attribute '__dict__' of 'Sample' objects>, '__weakref__': <attribute '__weakref__' of 'Sample' objects>, '__doc__': None})
>>> Sample.name
'rocky'
同じように、私たちがインスタンスを作成すると、各インスタンスにも一つの_u uがあります。dict_.属性は、現在の属性の例です。

>>> a = Sample()
>>> a.__dict__
{}
>>> a.age = 23
>>> a.__dict__
{'age': 23}
上の操作によって、インスタンスが作成されたばかりの時に、__udict_.は空です。インスタンス属性が作成されてから、その内容が含まれます。実例の_udict_.和類の_udict_.は違いがあります。すなわち、インスタンス属性とクラス属性は違います。
理論的には、クラスによって無数のインスタンスを作成することができます。dict_,これは恐ろしいことになります。dict_.メモリの容量が小さいので、もちろんこのことは実際にはありません。しかし、プログラムはこのような信頼できない推测のもとに立てられません。
ですから、コントロールできる方法が必要です。dict_,すると「ウウウ」slaots時運に応じて現れる。

>>> class Nature:
... __slots__ = ('tree','flower')
... 
>>> dir(Nature)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'flower', 'tree']
私たちはディルの結果をよく見てみます。dict_.属性がなくなりました。slaots同前dict_.絞り出しました。クラスの属性に入りました。

>>> Nature.__slots__
('tree', 'flower')
ここから分かるように、クラスNatureは二つの属性しか持っていません。クラスから見ると、そのクラスの属性はこの二つしかない。実例から見ても、その実例的な属性はこの2つだけである。

>>> Nature.tree = 'liushu'
>>> Nature.tree
'liushu'
>>> Nature.tree = 'lishu'
>>> Nature.tree
'lishu'
クラスを通して属性を賦課したり修正したりすることができます。これは以前のクラスの属性と変わらないようです。焦らないでください。続けて見れば違いが見られます。

>>> x = Nature()
>>> x.__slots__
('tree', 'flower')
>>> y = Nature()
>>> y.__slots__
('tree', 'flower')
>>> id(x.__slots__)
4531629384
>>> id(y.__slots__)
4531629384
ほら、実用化してから、実例の_uを見てください。slaots和類の_uslaotsまったく同じです。これは前の_u u u u u u u u uと同じです。dict_.だいぶ違っています。そして二つの例を確立した結果、二つの例の_u u u u u u u u u u u u u u u u u uを発見した。slaotsメモリの中には一つがあります。あるいは実例を増やす時です。slaots増えていません。

>>> x.tree
'lishu'
>>> y.tree
'lishu'
クラスの属性が既に与えられている以上、どのインスタンス属性を通しても同じ値が得られますが、この属性の値はインスタンスでは変更できません。

>>> x.tree = 'taoshu'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Nature' object attribute 'tree' is read-only
実例的な属性に対しては、クラスの静的データは読み取り専用であり、変更できません。クラスの属性によってのみ変更できます。しかし、まだ指定されていない属性については、インスタンスによって値を割り当てることができる。

>>> x.flower = 'rose'
>>> x.flower
'rose'
>>> x.flower = 'moli'
明らかに例示的な動作による属性は、インスタンスによっても変更可能であるが、インスタンス属性の値はクラス属性の値を変更することができない。

Nature.flower
<member 'flower' of 'Nature' objects>
上記からわかるように、インスタンス属性の値はクラスの属性に戻されていません。同じ名前のインスタンス属性が新たに作成されたということも理解できます。クラスの属性に値を付けると、次のようになります。

>>> Nature.flower = 'huaihua'
>>> x.flower
'huaihua'
クラスの属性はインスタンス属性に対して決定的な役割を持ち、インスタンスにおいてはクラスによって定義された属性は読み取り専用である。
同前slaots例の属性をしっかりと管理しました。指定された属性しかありません。属性を追加するには、クラス属性だけで実現できます。slaotsの重要な役割の一つはメモリを最適化することです。
後に書く
もちろんですslaots属性の読み込み速度を上げることもできます。これは本文のポイントではないので、あまり紹介しないで、興味がある人はGoogleに行ってみてください。
今日の文章はここまでです。明日は「属性ブロック」を話してください。また新しい一週間です。乾燥してきます。
文章があなたのためになると思ったら、もっと多くの人に見てもらいたいです。ありがとうございます。
The end
以上はpythonメモリの最適化の詳細を詳しく解説しました。pythonメモリの最適化に関する資料は他の関連記事に注目してください。