2015-09-17 3 views
2

Я пытаюсь узнать стандарты объектно-ориентированного языка Python, я написал очень простой кодPython Конструктор Chaining и полиморфизм

class Human(object): 
    def __init__(self): 
     print("Hi this is Human Constructor") 

    def whoAmI(self): 
     print("I am Human") 


class Man(Human): 
    def __init__(self): 
     print("Hi this is Man Constructor") 

    def whoAmI(self): 
     print("I am Man") 


class Woman(Human): 
    def __init__(self): 
     print("Hi this is Woman Constructor") 

    def whoAmI(self): 
     print("I am Woman") 

кажется довольно простой да? Классический модуль наследования мужчины и женщины, что я не могу понять, заключается в том, что когда я создаю объект для женщины или человека, почему не происходит цепочка конструктора и как можно достичь полиморфизма в Python.

Это похоже на настоящую неопределенную и нулевую линию допроса, но я не могу сказать ее другим способом. Любая помощь будет оценена

+3

см. Http://stackoverflow.com/questions/904036/chain-calling-parent-constructors-in-python – Hacketo

+0

Некоторым даже не нравится называть конструктор '__init__' конструктором, см. Http: // stackoverflow. com/вопросы/6578487/init-as-a-constructor – Moberg

ответ

4

У вас есть __init__() для Man, а также Woman, так что перекрывает __init__() от родительского класса Human. Если вы хотите, чтобы __init__() для дочернего класса вызывал родительский номер __init__(), вам необходимо позвонить ему, используя super(). Пример -

class Man(Human): 
    def __init__(self): 
     super(Man, self).__init__() 
     print("Hi this is Man Constructor") 

class Woman(Human): 
    def __init__(self): 
     super(Woman, self).__init__() 
     print("Hi this is Woman Constructor") 

Для Python 3.x, вы можете просто вызвать родитель __init__() использования - super().__init__().

+0

oh! такие языки, как C# или java, имеют это по умолчанию, можете ли вы, пожалуйста, помочь мне с полиморфизмом? мы можем создавать только специализированный объект в python? –

+0

Да, в Python, если у ребенка есть метод '__init __()', родительский '__init __()' не вызывается (если дочерний объект не имеет одного, вызывается '__init __()' родителя '). Мы можем создавать производные объекты в python, как те, которые вы создали. Если производный объект не предоставляет реализацию метода, но его родительский объект делает, тогда, когда вы вызываете этот метод в экземпляре производного объекта, вы получаете реализацию от родительского объекта (опять же, только если сам дочерний объект , не обеспечивает реализацию). –

+1

Я бы сказал, что здесь применяется «явное лучше, чем неявное» –

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