Вызов различных методов в Python - PullRequest
1 голос
/ 25 марта 2011

Хорошо, у меня есть следующее:

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.

Ответы [ 3 ]

3 голосов
/ 25 марта 2011

Обновление : Исходя из кода, который вы опубликовали сейчас, невозможно набрать 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 голос
/ 25 марта 2011

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

1 голос
/ 25 марта 2011

Я полагаю, что это означает то же самое , что и в любом языке программирования, который поддерживает объектно-ориентированную парадигму :

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