Вы можете использовать представление списка для создания нового списка, содержащего только те элементы, которые вы не хотите удалять:
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)
Да, но только с классами нового стиля . Используйте функцию super()
:
class Foo(Bar):
def baz(self, arg):
return super(Foo, self).baz(arg)
Python 3 имеет другой и более простой синтаксис для вызова родительского метода. Если класс Foo
наследуется от Bar
, то из Bar.__init__
можно вызвать из Foo
с помощью super().__init__()
:
class Foo(Bar):
def __init__(self):
super().__init__()
В 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()'
class A(object):
вместо class A():
. Тогда super () будет работать
– blndev
17 September 2017 в 16:50
ImmediateParentClass.frotz(self)
будет просто прекрасным, независимо от того, был ли непосредственно установленный родительский класс frotz
или унаследовал его. super
требуется только для правильной поддержки множественного наследования (и тогда он работает только в том случае, если каждый класс правильно использует его). В общем случае AnyClass.whatever
будет искать whatever
в предках AnyClass
, если AnyClass
не определяет / не отменяет его, и это справедливо для «метода родительского класса, вызывающего родительский метод», как и для любого другого случая !
Если вы не знаете, сколько аргументов вы можете получить, и хотите передать их всем потомкам:
class Foo(bar)
def baz(self, arg, *args, **kwargs):
# ... Do your thing
return super(Foo, self).baz(arg, *args, **kwargs)
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()
super(Foo, self)
для Python 2.x правильный? В Python 3.x предпочтительнееsuper()
? – Trevor Boyd Smith 24 April 2017 в 12:18