web-dev-qa-db-ja.com

孫クラスからスーパーメソッドを呼び出す方法は?

私は、3つのレベルのクラス継承を持つコードを使用しています。最下位レベルの派生クラスから、メソッドを呼び出すための構文は、階層を2レベル上げます。 super.superコール? 「中間」クラスは、呼び出す必要のあるメソッドを実装しません。

36
SeanLabs

さて、これはそれを行う1つの方法です。

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def my_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        Grandparent.my_method(self)

たぶんあなたが望むものではないかもしれませんが、私が間違っていない限り、それはpythonが持っている最高のものです。あなたが求めていることは反Python的であり、あなたが物事を幸せなpython方法で提供するためになぜそれをしているのかを説明する必要があります。

別の例、おそらくあなたが望むもの(あなたのコメントから):

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def some_other_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        super(Child, self).my_method()

ご覧のとおり、Parentmy_methodを実装していませんが、Childはsuperを使用して、Parentが「見る」メソッド、つまりGrandparentを取得できます。 my_method

60
CrazyCasta

これは私のために働く:

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def my_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        super(Parent, self).my_method()
27
Tomasz

python 3で作成およびテスト済み

class Vehicle:

    # Initializer / Instance Attributes
    def __init__(self, name, price):
        self.name = name
        self.price = price

    # instance's methods
    def description(self):
        print("\nThe car {} has a price of {} eur".format(self.name, self.price))
#Object Vehicle

m3 = Vehicle("BMW M3", 40000)

m3.description()

class Camper(Vehicle):

     def __init__(self,nome,prezzo,mq):
         super().__init__(nome,prezzo)
         self.mq=mq

         # instance's methods

     def description(self):
         super().description()
         print("It has a dimension of",format(self.mq)+" mq")

#Camper Object(A camper is also a Vehicle)
marcopolo=Camper("Mercede MarcoPolo",80000,15)

marcopolo.description()

出力:
BMW M3の価格は40000 eurです。
Mercede MarcoPoloの価格は80000 eurです。
15 mqの寸法

0
LucianoDemuru