このコードをアイドル状態で実行しようとすると、次のエラーが発生します。
class Myclass():
i = 1
x = Myclass()
x.y = 10
x.i=10
x.i
# 10
x.y
# 10
このクラスには属性'i'が1つしかありませんが、xy = 10を割り当てると、Pythonでどのように機能するようになりますか。それは問題ではありませんか?どうすればそれを防ぐことができますか?
このコードをアイドル状態で実行しようとすると、次のエラーが発生します。
class Myclass():
i = 1
x = Myclass()
x.y = 10
x.i=10
x.i
# 10
x.y
# 10
このクラスには属性'i'が1つしかありませんが、xy = 10を割り当てると、Pythonでどのように機能するようになりますか。それは問題ではありませんか?どうすればそれを防ぐことができますか?
他の回答が述べているように、これはバグではなく機能です。
__slots__
限定された属性セットのみを適用する場合は、新しいスタイルのクラス(から継承するクラス)を使用できますobject
。
class Myclass(object):
__slots__ = ['i']
>>> x = Myclass()
>>> x.i = 10
>>> x.y = 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Myclass' object has no attribute 'y'
Python は、Java などの他の多くの言語とは異なり、クラス メンバーを動的に割り当てます。つまり、代入できるようにするために、クラスの定義に変数を含める必要はありません。
また、割り当てているようなクラス変数には違いがあることに注意してください。
class Myclass():
i = 1
およびクラス メンバー:
class Myclass():
def __init__(self):
self.i = 1
これが、Python でクラス変数を定義する方法です。いくつかの「魔法の」機能を使用してこの動作を防ぐことができますが、一般的にはお勧めできません。