3

このコードをアイドル状態で実行しようとすると、次のエラーが発生します。

class Myclass():
    i = 1

x = Myclass()
x.y = 10
x.i=10
x.i
# 10
x.y
# 10

このクラスには属性'i'が1つしかありませんが、xy = 10を割り当てると、Pythonでどのように機能するようになりますか。それは問題ではありませんか?どうすればそれを防ぐことができますか?

4

3 に答える 3

4

他の回答が述べているように、これはバグではなく機能です。

__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'
于 2012-08-07T17:00:42.470 に答える
2

Python は、Java などの他の多くの言語とは異なり、クラス メンバーを動的に割り当てます。つまり、代入できるようにするために、クラスの定義に変数を含める必要はありません。

また、割り当てているようなクラス変数には違いがあることに注意してください。

class Myclass():
     i = 1

およびクラス メンバー:

class Myclass():
    def __init__(self):
        self.i = 1
于 2012-08-07T16:57:20.280 に答える
0

これが、Python でクラス変数を定義する方法です。いくつかの「魔法の」機能を使用してこの動作を防ぐことができますが、一般的にはお勧めできません。

于 2012-08-07T16:57:18.540 に答える