0

2 つのオブジェクトを作成しようとしていますが、

  1. A通常の Python クラスとして定義することにより
  2. Bプロパティを動的に作成します。

両方のクラスが作成されたら、それらの辞書を印刷しようとしていますが、動的に作成されたクラス B の属性「X」がリストされていないことに気付きました。

class A(object):
    def __init__(self,x,y):
        self.x = 0
        self.y = 0


x = A(1,2)
print "Class A directory =",dir(x)

class B:pass
B().x = 5
y = B()
print "Class A directory =",dir(y)

出力

Class A directory = ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'x', 'y']
Class B directory = ['__doc__', '__module__']
4

1 に答える 1

8

B()B のインスタンスを作成します。 をB().x = 5実行すると、インスタンスを作成し、属性を設定してxから、インスタンスを破棄します ( を何にも割り当てていないためB())。次に、 を使用して別のインスタンスを作成しますがy = B()、このインスタンスは、前のインスタンスに対して行ったことの影響を受けません。

できるよ:

y = B()
y.x = 5

ただし、いくつかの用語の誤解があります。どちらの例でも、クラスではなくインスタンスで呼び出しdirています。またはを印刷すると、どちらの場合も属性がリストされていないことがわかります。これは、クラス自体ではなく、クラスのインスタンスにのみ存在するためです。dir(A)dir(B)x

また、B が「動的に作成された」のに対し、A は「通常の Python クラスとして定義された」というのは正しくありません。どちらも通常の Python クラスです。xクラス A は初期化時に属性を作成するように定義されていますが、クラスBはそうではありません (後でそのインスタンスに属性を追加します)。クラス B は依然として通常の Python クラスであり、A とは定義された動作が異なるだけですx = A(); x.newAttr = "blah"

また、タイトルでメタクラスについて言及していますが、ここではメタクラスをまったく使用していません。

于 2013-09-12T20:11:14.603 に答える