2011-03-25 1 views
1

Хорошо, так у меня есть следующий:ссылающиеся на различных методов в Python

Class OwnableObject(MobileObject): 
    def __init__(self, name): 
     MobileObject.__init__(self, name) 
     self.owner = None # not owned 

    def is_ownable(self): return True 
    def is_owned(self): return self.owner 

чем разница между вызовом метода is_ownable на OwnableObject
и вызова метода is_ownable на MobileObject.

+1

Давление, которое является общим вопросом программирования, а не специфичным для Python. Вы должны прочитать о классах и наследовании в некотором тексте по объектно-ориентированному программированию. – Genba

+0

123, см. Мой отредактированный ответ ниже. Поскольку здесь для «MobileObject» не существует определения 'is_ownable', вы не можете этого сделать:' mo = MobileObject(); mo.is_ownable() '. Результатом будет ошибка. Мой ответ показывает, как делать то, что вы описываете. – senderle

ответ

1

Я полагаю, что это означает, что same thing, как и в любом языке программирования, который поддерживает object oriented paradigm:

>>> class Base: 
...  def ok(self): 
...   print 'OK' 
... 
>>> class SubClass(Base): 
...  def oops(self): 
...   print 'Oops' 
... 
>>> x = SubClass() 
>>> x.ok() 
OK 
>>> 
3

Update: на основе кода вы публикуемую сейчас, это нельзя назвать is_ownable на MobileObject, потому что MobileObject не имеет определения для is_ownable.

Если это так, то разница - это просто разница между определением MobileObject и определением OwnableObject. Я обновил условия ниже, чтобы проиллюстрировать, что я имею в виду.

Если вы создаете класс в Python (или на любом языке, на самом деле):

class MobileObject(object): 
    def __init__(self, position): 
     self.position = position 
    def move(self, position): 
     self.position = position 
    def is_ownable(self): 
     return False 

А затем создать подкласс:

class OwnableObject(MobileObject): 
    def __init__(self, position, owner=None): 
     MobileObject.__init__(self, position) 
     self.owner = owner 
    def is_ownable(self): 
     return True 
    def is_owned(self): 
     return self.owner 

Полученный подкласс автоматически наследует методы суперкласса :

movable = MobileObject() 
movable.is_ownable()  # returns False 
movable.move(new_position) # moves movable 
movable.is_owned()   # causes an error 

ownable = OwnableObject() 
ownable.is_ownable()  # returns True 
ownable.move(new_position) # moves ownable 
movable.is_owned()   # returns owner or None 

Как вы можете видеть, is_ownable() и is_owned() отличаются между двумя классами, а в последнем случае, поскольку is_owned() не определен, он вызывает ошибку при вызове на movable. Но move() работает одинаково в обоих классах.

+1

Публикация многострочного кода в поле комментариев на самом деле не работает, поэтому я не могу сказать, что вы просите. Не могли бы вы изменить свой исходный вопрос? – senderle

+0

@ Python123: Пожалуйста, отредактируйте свой вопрос, если у вас есть еще что добавить. Неформатированный код Python без разрывов строк и интервалов может изменить все. – unholysampler

1

Все методы, реализованные в базовом классе, могут быть вызваны в подкласс. Базовая реализация будет использоваться, если вы не переопределите метод в подклассе.