Вызовите метод родительского класса из дочернего класса в Python? - PullRequest
513 голосов
/ 30 апреля 2009

При создании простой иерархии объектов в Python я хотел бы иметь возможность вызывать методы родительского класса из производного класса. В Perl и Java для этого есть ключевое слово (super). В Perl я мог бы сделать это:

package Foo;

sub frotz {
    return "Bamf";
}

package Bar;
@ISA = qw(Foo);

sub frotz {
   my $str = SUPER::frotz();
   return uc($str);
}

В python кажется, что я должен явно назвать родительский класс от дочернего. В приведенном выше примере мне нужно сделать что-то вроде Foo::frotz().

Это кажется неправильным, поскольку такое поведение затрудняет создание глубоких иерархий. Если дети должны знать, какой класс определяет унаследованный метод, то создается всякая информационная боль.

Это фактическое ограничение в python, пробел в моем понимании или оба?

Ответы [ 15 ]

1 голос
/ 30 октября 2018

в этом примере cafec_param - это базовый класс (родительский класс), а abc - дочерний класс. abc вызывает метод AWC в базовом классе.

class cafec_param:

    def __init__(self,precip,pe,awc,nmonths):

        self.precip = precip
        self.pe = pe
        self.awc = awc
        self.nmonths = nmonths

    def AWC(self):

        if self.awc<254:
            Ss = self.awc
            Su = 0
            self.Ss=Ss
        else:
            Ss = 254; Su = self.awc-254
            self.Ss=Ss + Su   
        AWC = Ss + Su
        return self.Ss
         

    def test(self):
        return self.Ss
        #return self.Ss*4

class abc(cafec_param):
    def rr(self):
        return self.AWC()


ee=cafec_param('re',34,56,2)
dd=abc('re',34,56,2)
print(dd.rr())
print(ee.AWC())
print(ee.test())

выход

56

56

56

1 голос
/ 21 января 2017

В Python 2 мне не очень повезло с super (). Я использовал ответ от jimifiki в этом SO поток как ссылаться на родительский метод в Python? . Затем я добавил к этому свой небольшой поворот, который, я думаю, является улучшением юзабилити (особенно если у вас длинные имена классов).

Определение базового класса в одном модуле:

 # myA.py

class A():     
    def foo( self ):
        print "foo"

Затем импортируйте класс в другие модули as parent:

# myB.py

from myA import A as parent

class B( parent ):
    def foo( self ):
        parent.foo( self )   # calls 'A.foo()'
0 голосов
/ 28 марта 2019
class department:
    campus_name="attock"
    def printer(self):
        print(self.campus_name)

class CS_dept(department):
    def overr_CS(self):
        department.printer(self)
        print("i am child class1")

c=CS_dept()
c.overr_CS()
0 голосов
/ 31 августа 2018
class a(object):
    def my_hello(self):
        print "hello ravi"

class b(a):
    def my_hello(self):
    super(b,self).my_hello()
    print "hi"

obj = b()
obj.my_hello()
0 голосов
/ 20 июня 2011

Это более абстрактный метод:

super(self.__class__,self).baz(arg)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...