0

私はPython言語が初めてです。私はそれで10日間しか経験していません。学び始めは特に難しいことはありませんが、「オブジェクト指向の概念」、特に「継承」に到達すると遅くなります。

「継承された子クラスは、親クラスの特性と動作、つまり親のデータとメソッドのすべてを取得できる」という私の背景知識の一部。わかりました、2 つのプログラムで私を混乱させる概念を示します。どちらも同じ結果になっているのに、なぜ人は違うものを作っているのか。

初め:

class Parent():    
    parentdata = 0    
    def __init__(self):        
        pass    
    def getParentData(self):
        return Parent.parentdata
    def setParentData(self, setdata):
        Parent.parentdata = setdata



class Child(Parent):
    childdata = 0
    def __init__(self):
        pass
    def getChildData(self):
        return Child.childdata
    def setChildData(self, setdata):
        Child.childdata = setdata


child = Child()
print "Default Child's Data is :" + str(child.getChildData())#getting 0
child.setChildData(3)
print "After Adding Child's Data is :"+ str(child.getChildData()) # getting 3
print "Default Parent's Data is:"+ str(child.getParentData())# getting 0
child.setParentData(1)
print "After Adding Parent's Data is :"+str(child.getParentData())# getting 1

2番:

class Parent():
    parentdata = 0
    def __init__(self):
        pass
    def getParentData(self):
        return Parent.parentdata
    def setParentData(self, setdata):
        Parent.parentdata = setdata

class Child(Parent):
    childdata = 0
    def __init__(self):
        #super(Child, self).__init__()
        #super(Child, self).__init__(self, self)
        Parent.__init__(self)
    def getChildData(self):
        return Child.childdata
    def setChildData(self, setdata):
        Child.childdata = setdata
child = Child()
print "Default Child's Data is :" + str(child.getChildData())#getting 0
child.setChildData(3)
print "After Adding Child's Data is :"+ str(child.getChildData()) # getting 3
print "Default Parent's Data is:"+ str(child.getParentData())# getting 0
child.setParentData(1)
print "After Adding Parent's Data is :"+str(child.getParentData())# getting 1

Super()また、誰かが使用したメソッドの使用方法、そこにあるスーパーメソッド、およびいくつかは私のやり方で行っているメソッドの使用方法も教えてください.私はParent.__init__(self) これら2つの違いがはっきりしていません.

これら2つのプログラムでは__init__、コンストラクターとして使用していません。asを使用__init__してクラスのデータ (childdata、parentdata) にデータを追加する場合、どのようにパラメーターを挿入し、そのメソッドParent.__init__(self)の両方に挿入しますか?def __init__(self):

4

1 に答える 1

1

あなたの例は期待通りに動作しているようです。クラスレベルのデータを使用して両方のクラスを設定しました。つまり、すべての親が同じ値のparentDataを共有し、すべての子が同じ値のchildDataを共有します。メソッド名は共有されないため、'Child'インスタンスは'Parent'とは独立して動作しますが、ChildでsetParentDataを呼び出すと、値がすべての親の状態にプッシュされますが、すべての子の状態にはプッシュされません

より一般的な例は次のようになります。

class Parent(object):
     shared_state = 0

     def __init__(self):
         self.private_state = 1

     def get_shared(self):
         return self.shared_state

     def get_private(self)
         return self.private_state

class Child(Parent):
    shared_state = 2

    def __init__(self):
        Parent.__init__(self)
        self.private_state = 3 
        #in this case calling the Parent constructor is not really needed but it's good practice


 p = Parent()
 p.get_shared()
 > 0
 p.get_private()
 > 1

 new_p = Parent()
 new_p.get_shared()
 > 0


 c = Child()
 c.get_shared()
 > 2
 c.get_private()
 > 3

この例では、すべての親が変数'shared_state'を共有していますが、それぞれが他の親から独立した独自のprivate_stateのコピーを持っています。同様に、各子は子のshared_stateのコピーを共有します。これは親の共有状態とは異なります。

基本的に、同じ名前(shared_stateなどのクラス変数の場合)またはメソッド(get_privateやget_sharedなど)が子クラスに表示されると、元のバージョンが上書きされます。そのため、子でget_shared()を呼び出すと、Child.shared_stateである2が返されます。元のコードでは、CholdからParent.parentDataを明示的に呼び出したため、Parentから値を取得しました。

継承の背後にある中心的な考え方は、共通の機能を簡単に共有し、特定のニーズに固有のものに対してのみ新しいクラスまたはメソッドを作成することです。

class Vehicle(object):
    def __init__(self, name, passengers):
       self.Passengers = passengers
       self.Name = name

    def go(self):
       print "%n is going with  %i passengers" % (self.Name, self.Passengers)

    def get_name(self):
       print self.Name

class Car(Vehicle):
    def go(self):
       print "%n is driving along with  %i passengers" % (self.Name, self.Passengers)

class Boat(Vehicle):
    def go(self):
       print "%n is sailing along with  %i passengers" % (self.Name, self.Passengers)

class Truck(Car):
    def deliver(self):
        print "%n is delivering cargo" % self.Name

ここでは、サブクラスはすべて「移動」できますが、さまざまな方法で実行されます。サブクラスを使用するコードは、サブクラスが何であるかを知る必要がなく、呼び出しが実行されるだけで、独自の方法で実行されます。トラックは車のように「行き」、ボートや車にはない配達を行う方法もあります。すべてのクラスは「get_name」メソッドを共有しているため、書き直す必要はありません。すべての派生クラスに無料で存在します。ご覧のとおり、関数とデータを共有したり、同じ名前の異なる関数やデータに置き換えたり(外部コードが同じ方法で取得できるように)、新しい関数やデータを追加したりできます。

これらのアイデアのより完全な紹介については、HeadFirstPythonをチェックすることをお勧めします。そしてもちろん、ここSOにはたくさんのことがあります。

于 2013-01-19T07:36:15.447 に答える