2012-06-07 2 views
10

Например, у меня есть базовый класс и производный класс:Можно ли наследовать python @classmethod?

>>> class Base: 
... @classmethod 
... def myClassMethod(klass): 
...  pass 
... 
>>> class Derived: 
... pass 
... 
>>> Base.myClassMethod() 
>>> Derived.myClassMethod() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: class Derived has no attribute 'myClassMethod' 

Можно ли иметь производный класс быть в состоянии назвать myClassMethod без перезаписи его и вызова метода суперкласса в? Я бы хотел перезаписать метод класса только тогда, когда это необходимо.

+6

Ваш класс 'Derived' не является производным от' Base'. В противном случае это сработает. –

ответ

17

Да, они могут быть унаследованы.

Если вы хотите наследовать членов, вам нужно сообщить python о наследовании!

>>> class Derived(Base): 
... pass 

Это хорошая практика, чтобы сделать ваш Base класс наследует от объекта (но он будет работать без вас делать это):

>>> class Base(object): 
...  ... 
+8

Это только хорошая практика в python 2.x - в 3.x, это лишнее, поскольку все наследуется от 'object'. – James

+5

@James: правда, но большинство вопросов на SO все еще около 2.7 – Eric

+1

Что делать, если через несколько лет это перестало быть таким? – Daerdemandt

3

Вы должны определить базовый класс в подклассе:

class Derived(Base): 
    ... 
Смежные вопросы