Обектно-ориентираното програмиране ни позволява да моделираме концепции от външния свят в структури, разбираеми за машината. Това се нарича създаване на абстрактни типове на данни.
class Polynomial(object): def __init__(self, *cfs): ... def order(self): ... ... a = Polynomial(1, 4, 2) # x^2 + 4x + 2 print a[3], a[2], a[1], a[0] # 0 1 4 2 print a.order() # 2 b = Polynomial(1, 1, 4, 1) # x^3 + x^2 + 4x + 1 c = b - a # x^3 - 1 d = Polynomial(1, 0, 0, 1) # x^3 + 1 e = c * d # x^6 - 1
Всеки обект може да се разглежда като сбор от две неща:
Интерфейс:
y = power(x, a)
Имплементация:
def power(x, a): return 1 if a == 0 else power(x, a - 1) * x
def power(x, a):
if a == 0: return 1
r = power(x, a/2)
return x * x * (x if a % 2 else 1)
def power(x, a): return reduce(lambda a, b: a * b, [x] * a)
def power(x, a):
r = 1
for _ in range(a): r *= x
return x
def power(x, a): return x ** a
Има различни начини, по които може да представим абстрактната концепция в примитивите на езика.
(1, 2, 3) -> x^2 + 2x + 3
(3, 1) -> 3x + 1
((1, 2), (2, 1), (3, 0)) -> x^2 + 2x + 3
((1, 1), (2, 1), (1, 0)) -> 3x + 1
{2: 1, 1: 2, 0: 3} -> x^2 + 2x + 3
{1: 3, 0: 1} -> 3x + 1
Обикновено има разлика между множеството от стойности, които структурата на представянето може да приеме и множеството от стойности, които имат смисъл. Последните се наричат инвариант на представянето (representation invariant)
Например ако моделирате интервал от цели числа, може да го представите вътрешно като наредена двойка (лява граница, дясна граница)
. Съответно, (2, 6)
е смислено представяне, но (6, 2)
- не.
Функцията (в математически смисъл) съпоставяща инварианта на представянето на множеството от моделирани концепции се нарича абстрактна функция на този абстрактен тип.
Методите на един обект могат да се разделят на два вида:
int
, tuple
, str
, float
, long
, complex
и т.н.За всеки метод се дефинира следното:
Клас Б може да наследи от клас А, само ако на всички места на които може да използвате инстанция на А може да използвате инстанция на Б.
В термините на Design by Contract:
Б може да наследи А ако: