2014-07-31 6 views
3

parent.py:вызова метода класса ребенка из файла родительского класса в Python

class A(object): 
    def methodA(self): 
     print("in methodA") 

child.py

from parent import A 
class B(A): 
    def methodb(self): 
     print("am in methodb") 

Есть ли вообще назвать methodb() в parent.py?

+6

Если вам нужно, это довольно значительный запах кода. – roippi

+0

Может быть, я делаю это неправильно, но ищу другого разумного подхода. –

+0

@JagadeeshNM Трудно сказать, что вы можете делать неправильно и как быть умнее, потому что это не очевидно, что вы на самом деле пытаетесь достичь, делая это. Похоже, что ваша проблема связана с несчастливым подходом к вашему более широкому дизайну программы ... – kratenko

ответ

1

Вы можете использовать функцию в любом месте , если она была прикреплена к объекту, который, как представляется, из вашего образца. Если у вас есть объект B, вы можете использовать его функцию methodb() из абсолютно любого места.

parent.py:

class A(object): 
    def methoda(self): 
     print("in methoda") 

def aFoo(obj): 
    obj.methodb() 

child.py

from parent import A 
class B(A): 
    def methodb(self): 
     print("am in methodb") 

Вы можете увидеть, как это работает после импорта:

>>> from parent import aFoo 
>>> from child import B 
>>> obj = B() 
>>> aFoo(obj) 
am in methodb 

Конечно, вы не сможете создать новый объект B изнутри parent.py, но вы все равно сможете использовать его методы, если он передается функции в parent.py как-то.

9

Выполнение этого будет иметь смысл только в том случае, если A является абстрактным базовым классом, что означает, что A предназначен только для использования в качестве базы для других классов, а не для непосредственного создания. Если бы это было так, вы бы определить methodB на класс А, но оставить его невыполненным:

class A(object): 
    def methodA(self): 
     print("in methodA") 

    def methodB(self): 
     raise NotImplementedError("Must override methodB") 


from parent import A 
class B(A): 
    def methodB(self): 
     print("am in methodB") 

Это не является строго необходимым. Если вы не объявляете methodB в любом месте A и создаете экземпляр B, вы все равно сможете позвонить methodB с тела methodA, но это плохая практика; неясно, откуда должно появиться methodA, или что дочерние классы должны переопределить его.

Если вы хотите быть более формальным, вы можете использовать модуль Python abc для объявления A как абстрактного базового класса.

from abc import ABCMeta, abstractmethod 

class A(object): 
__metaclass__ = ABCMeta 

    def methodA(self): 
     print("in methodA") 

    @abstractmethod 
    def methodB(self): 
     raise NotImplementedError("Must override methodB") 

Используя это будет на самом деле мешает вам инстанцировании A или любой класс, который наследуется от A без перекрывая methodB. Например, если B выглядит следующим образом:

class B(A): 
    pass 

Вы получили бы ошибка при попытке создать его экземпляр:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Can't instantiate abstract class B with abstract methods methodB 

То же самое произойдет, если вы пытались инстанцировании A.

4

Вы можете сделать что-то вроде этого:

class A(): 
    def foo(self): 
     self.testb() 

class B(A): 
    def testb(self): 
     print 'lol, it works' 
b = B() 
b.foo() 

Обратите внимание, что на самом деле не существует ни одного вызова от родителей, есть только вызов функции foo из экземпляра дочернего класса, этот экземпляр унаследовал foo от родителей , то это невозможно:

a=A() 
a.foo() 

будет производить: AttributeError: A instance has no attribute 'testb'

потому

>>> dir(A) 
['__doc__', '__module__', 'foo'] 
>>> dir(B) 
['__doc__', '__module__', 'foo', 'testb'] 

То, что я хотел показать, что вы можете создать экземпляр класса ребенка, и он будет иметь все методы и параметры от обоих родителей, и это собственных классов.

Смежные вопросы