0

これらのスクリプトが異なる動作をする理由がわかりません:

class A:
  x=3
  y=5
  __z=8
  def __init__(self):
    print "Hi, I am an instance object of A class!"
    print "I have two components: x i y"
    print "Component x =", self.x
    print "Component y =", self.y
    print 'Component z=', self.__z, 'but z is private'
  def fun1(self):
    return self.x+self.y
class B(A):
  pass 
i=B()
print i.x, i.y, i.fun1()      

行を削除i=B()して最後の行を に変更すると、メソッドを呼び出すたびにクラス A が作成されるためprint B().x, B().y, B().fun1()、文字列が 3 回出力されます。__init__「i」インスタンスを作成しても同じことが起こらないのはなぜですか?

4

2 に答える 2

3

のインスタンスを 1 つだけ作成しましたB:

i=B()

So__init__は一度だけ呼び出されます。B他の例では、 3 回の新しいインスタンスを作成しました。

于 2013-04-19T18:41:51.537 に答える
1

作成されたインスタンスごとに 1 回だけ実行されるため__init__(明示的に呼び出された場合、"決して" と見なされることはめったにありません)。1 つのインスタンスを作成して 1__init__回実行し、3 つのインスタンスを作成して__init__3 回実行します。を呼び出すたびB()に、新しいインスタンスを作成します。

xまた、クラス属性、y、および__zは、クラスのインスタンスではなく、クラス自体に属していることに注意してください。やっているときにそれらを参照するselfことは、問題を引き起こすクラスとインスタンスの違いについての明らかな誤解から生じる別の問題です。

クラスは、オブジェクトの定義と考えることができます。クラス ( ) を呼び出すと、B()そのインスタンスが作成されます。クラス属性は定義自体に属し、インスタンス属性はオブジェクトに属します。

クラスはプレス機の金型のようなものだと考えてください。車のフェンダーを作るための金型があると想像してください。各フェンダーはオブジェクト インスタンスです。各フェンダーには、インスタンス アトリビュートである色があります。ただし、サイコロ自体も色を持つことができ、それはクラス属性になります。各バンパーは異なる色を持つことができ、他のフェンダーやダイスの色を変更することなく、任意のフェンダーの色を変更できますが、フェンダーをいくつ作成してもダイスは 1 つしかなく、ダイスは 1 つしかありません。色。

>>> class Fender(object):
...     color = 'red'
...     def __init__(self):
...         self.color = None
...
>>> fenders = [Fender(), Fender()]
>>> Fender.color
'red'
>>> fenders[0].color = 'blue'
>>> fenders[1].color = 'grey'
>>> fenders[0].color
'blue'
>>> fenders[1].color
'grey'
>>> Fender.color
'red'
>>> fenders[0].__class__.color
'red'
>>> Fender.color = 'black'
>>> fenders[0].color
'blue'
>>> fenders[1].color
'grey'
>>> Fender.color
'black'
>>> fenders[0].__class__.color
'black'
于 2013-04-19T18:41:37.307 に答える