LINUX.ORG.RU

Сообщения AN0NYMOUS

 

sed regexps

Форум — Development

Sed поддерживает ретроспективную и опережающую проверку в регулярных выражениях?

AN0NYMOUS
()

А хаскелл такое умеет?

Форум — Development

Можно ли в нем сделать полиморфизм по четности числа? Т.е. у нас будет два числовых типа Even (нечетные) и Odd (четные), и для каждого можно определить свою функцию.

AN0NYMOUS
()

[python][CL][OOP] square is not rectangle

Форум — Development

Собственно суть проблемы (принцип подстановки Барбары Лисков) в ООП. http://ru.wikipedia.org/wiki/Принцип_подстановки_Барбары_Лисков

Для труЪ объясняю на примере, который калька википедийного, но только на питоне, потому как он меня больше интересует. Допустим у нас есть класс Прямоугольник и класс-наследник Квадрат.

  class Rectangle():
      def __init__(self, width, height):
          self.width = width
	  self.height = height
	  
      def perimeter(self):
          return 2*(self.width + self.height)
	  
      def area(self):
          return self.width * self.height

      def print(self):
          print "Rectangle ", self.height, self.width

  class Square(Rectangle):
      def __init__(self, size):
          self.set_side(size)
	  
      def set_side(size):
          self.width = size
	  self.height = size

      def print(self):
          print "Square ", self.width
  
Тогда возможен следующий код:
  s = Square()
  s.set_size(5)
  s.set_height(10)
  
Тогда мы получаем, что наш квадрат на самом деле не квадрат. Это плохо. Исправить это можно по-разному. Можно попробовать переопределить set_height set_width методы, или даже кинуть исключение, или сделать класс Rectangle immutable. Но это все костыли - и делать так очень плохо.

Решить эту проблему по-настоящему может динамическое изменение класса объекта, тогда принцип подстановки выполняется. Должно выглядеть это так:

  s = Square()
  s.set_size(5)
  s.print()        # Square 5
  s.set_height(10) # here we change s class from Square to Rectangle
  s.print()        # Rectangle 10 5
  s.set_width(10)  # here class of s change from Rectangle to Square
  s.print()        # Square 10
  
Вопрос в том, возможно ли реализовать это на питоне с помощью метаклассов, inspect или еще чего (я так подозреваю, что да)? И если такое можно ли считать, это разрешением проблемы LSP в ООП?

<holywar_mode>

На CLOS (Common Lisp) это реализуется более чем просто - там есть change-class.

</holywar_mode>

 ,

AN0NYMOUS
()

RSS подписка на новые темы