Метод наследования перезаписывается в некоторых условиях [дубликат]

Вы можете использовать представление списка для создания нового списка, содержащего только те элементы, которые вы не хотите удалять:

somelist = [x for x in somelist if not determine(x)]

Или, назначив срез somelist[:], вы можете мутировать существующий список содержит только те элементы, которые вы хотите:

somelist[:] = [x for x in somelist if not determine(x)]

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

Вместо этого понимания, вы также можете использовать itertools. В Python 2:

from itertools import ifilterfalse
somelist[:] = ifilterfalse(determine, somelist)

Или в Python 3:

from itertools import filterfalse
somelist[:] = filterfalse(determine, somelist)
444
задан jjohn 5 May 2014 в 19:29
поделиться

14 ответов

Да, но только с классами нового стиля . Используйте функцию super() :

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
509
ответ дан Adam Rosenfield 24 August 2018 в 08:07
поделиться
  • 1
    Можете ли вы также не делать & quot; вернуть Bar.baz (self, arg) & quot ;? Если да, то что было бы лучше? – Chris Cameron 30 April 2009 в 03:09
  • 2
    Да, вы можете, но OP спрашивал, как это сделать, без явного наложения суперкласса на сайт вызова (в этом случае Bar (Bar)). – Adam Rosenfield 30 April 2009 в 03:13
  • 3
    super () является странным с множественным наследованием. Он вызывает «следующий». класс. Это может быть родительский класс или может быть совершенно несвязанным классом, который появляется в другом месте иерархии. – Steve Jessop 1 May 2009 в 16:41
  • 4
    Стив, большую часть времени он делает то, что наиболее разумно, например, когда вы сталкиваетесь с en.wikipedia.org/wiki/Diamond_problem . – Turion 24 July 2012 в 22:28
  • 5
    Я использую Python 2.x, и я получаю & quot; Ошибка: должен быть тип, а не classobj & quot; когда я это делаю – Chris F 14 December 2016 в 21:30
  • 6
    Синтаксис super(Foo, self) для Python 2.x правильный? В Python 3.x предпочтительнее super()? – Trevor Boyd Smith 24 April 2017 в 12:18

Python 3 имеет другой и более простой синтаксис для вызова родительского метода. Если класс Foo наследуется от Bar, то из Bar.__init__ можно вызвать из Foo с помощью super().__init__():

class Foo(Bar):
    def __init__(self):
        super().__init__()
31
ответ дан Arun Ghosh 24 August 2018 в 08:07
поделиться
  • 1
    Приятно слышать, что у python 3 есть лучшее решение. Вопрос исходит от python 2.X. Спасибо за предложение. – jjohn 26 July 2016 в 15:53
21
ответ дан Ben 24 August 2018 в 08:07
поделиться

В Python 2 мне не повезло с super (). Я использовал ответ от jimifiki на этом SO thread как ссылаться на родительский метод в 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()'
5
ответ дан Community 24 August 2018 в 08:07
поделиться
  • 1
    Вы должны использовать class A(object): вместо class A():. Тогда super () будет работать – blndev 17 September 2017 в 16:50
  • 2
    Я не уверен, что буду следовать. Вы имеете в виду определение класса? Очевидно, вы должны указать, что у класса есть родитель, чтобы подумать, что вы можете обратиться к родителям! Поскольку я опубликовал это 9 месяцев назад, я немного неясен в деталях, но я думаю, что я имел в виду примеры из Arun Ghosh, lawrence, kkk и т. Д., Которые не применимы в Py 2.x. Вместо этого, вот метод, который работает и простой способ ссылаться на родителя, поэтому немного более понятно, что вы делаете. (например, используя супер) – BuvinJ 18 September 2017 в 12:37
ImmediateParentClass.frotz(self)

будет просто прекрасным, независимо от того, был ли непосредственно установленный родительский класс frotz или унаследовал его. super требуется только для правильной поддержки множественного наследования (и тогда он работает только в том случае, если каждый класс правильно использует его). В общем случае AnyClass.whatever будет искать whatever в предках AnyClass, если AnyClass не определяет / не отменяет его, и это справедливо для «метода родительского класса, вызывающего родительский метод», как и для любого другого случая !

70
ответ дан industryworker3595112 24 August 2018 в 08:07
поделиться
  • 1
    Это означает, что ImmediateParentClass также присутствует в области действия этого оператора. Просто использование объекта, импортированного из модуля, не поможет. – Tushar Vazirani 14 March 2018 в 19:04
  • 2
    что, если это метод класса? – Shiplu Mokaddim 3 April 2018 в 15:57
9
ответ дан Joran Beasley 24 August 2018 в 08:07
поделиться
4
ответ дан kkk 24 August 2018 в 08:07
поделиться
13
ответ дан lawrence 24 August 2018 в 08:07
поделиться
97
ответ дан MaBe 24 August 2018 в 08:07
поделиться
-21
ответ дан user806071 24 August 2018 в 08:07
поделиться
25
ответ дан yesnik 24 August 2018 в 08:07
поделиться

Если вы не знаете, сколько аргументов вы можете получить, и хотите передать их всем потомкам:

class Foo(bar)
    def baz(self, arg, *args, **kwargs):
        # ... Do your thing
        return super(Foo, self).baz(arg, *args, **kwargs)

(From: Python - Самый чистый способ переопределить __init__, где после вызова super () следует использовать необязательный kwarg )

5
ответ дан Community 7 October 2018 в 15:26
поделиться
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()
-3
ответ дан shim 7 October 2018 в 15:26
поделиться
  • 1
    Добро пожаловать в stackoverflow. Этот вопрос уже был дан более подробно, почти десять лет назад, ответ принят и в значительной степени одобрен, и ваш ответ не добавляет ничего нового. Возможно, вы захотите попытаться ответить на более недавние (и, желательно, без ответа) вопросы. Как примечание, в редакторе есть кнопка для правильного форматирования кода. – bruno desthuilliers 31 August 2018 в 13:48
0
ответ дан Khan 6 November 2018 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: