Czy w Pythonie można tworzyć klasy abstrakcyjnie podobnie jak w C++?

0

Czy w Pythonie można tworzyć klasy abstrakcyjnie podobnie jak w C++? Mam na myśli klasę, która będzie zawierać podstawowe atrybuty, będzie służyć do tworzenia klas pochodnych i nie będzie można utworzyć obiektu tej klasy.

# base class
class Person():

  def __init__(self, name, surname):
    self.__name = name
    self.__surname = surname
    print("[Person created]")

  def getName(self):
    return self.__name

  def getSurname(self):
    return self.__surname

  def __str__(self):
    return "{name} {surname}".format(name=self.__name, surname=self.__surname)


# derived class
class Employee(Person):

  def __init__(self, name, surname, payment):
    Person.__init__(self, name, surname)
    self.__payment = payment
    print("[Employee created]")

  def getPayment(self):
    return self.__payment

  def setPayment(self, payment):
    self.__payment = payment

  def __str__(self):
    return "{name} {surname} {payment}".format(name=self.getName(), surname=self.getSurname(), payment=self.__payment)


def main():
  john = Person("John", "Doe")
  print(john)
  michael = Employee("Michael", "Stanley", 10000)
  print(michael)
  michael.setPayment(5000)
  print(michael)


# main
if __name__ == "__main__":
  main()

0

Jak napisano wyżej, do tworzenia interfejsów jest w Pythonie moduł abc, a składniowo wygląda to tak(przykładowy interfejs stosu LIFO, z jedną tylko implementacją - arrayList):

from _collections_abc import ABCMeta, abstractmethod


class Stack(metaclass=ABCMeta):
    @abstractmethod
    def is_empty(self):
        pass

    def size(self):
        pass

    def push(self):
        pass

    def pop(self):
        pass


class ArrayListStack:

    def __init__(self):
        self.array = []

    def is_empty(self):
        return not self.array

    def size(self):
        return len(self.array)

    def push(self, item):
        self.array.append(item)

    def pop(self):
        return self.array.__delitem__(-1)

    def __str__(self):
        return str(self.array)


Stack.register(ArrayListStack)

if __name__ == '__main__':
    s1 = ArrayListStack()
    print(s1.is_empty())
    s1.push(1)
    s1.push(2)
    print(s1, s1.size())
    s1.pop()
    print(s1, s1.is_empty(), s1.size())

1 użytkowników online, w tym zalogowanych: 0, gości: 1