Всем привет,

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

В то время как Java, C# или даже C++ имеют объектно-ориентированную систему, которая поддерживает принудительное применение типов атрибутов, интерфейсы и абстрактные классы, Python может в какой-то степени предоставить эти вещи, но без какого-либо принудительного применения.

Это всегда казалось мне постыдным, потому что Python во многих отношениях очень мощный язык, но это также делает его подверженным ошибкам. Например, у меня было много ошибок в Python, когда я пытался присвоить значение неправильному атрибуту, потому что я просто неправильно написал его имя на один символ (например, namee вместо name).

Еще одна проблема, которая показалась мне проблематичной, заключается в том, что существует множество повторяющихся задач, которые мы выполняем при создании классов, которые также можно автоматизировать, от конструкторов, применения типов, ленивых атрибутов до создания геттеров/сеттеров (хотя я знаю о декоратор @property, я всегда предпочитал методы get/set). Конечно, Python 3.7 представил классы @dataclass, они очень упрощены — нет принудительного применения типов, назначение значений по умолчанию в лучшем случае является базовым (вы не можете вызвать метод для присвоения их значений по умолчанию), не говоря уже о ленивых атрибутах или окончательных атрибутах.

По этой причине я решил создать новую объектно-ориентированную систему для Python — Kisa. Предполагается, что Kisa привнесет множество улучшений по сравнению с собственной объектно-ориентированной системой Python, в том числе:

  • Автоматически сгенерированные геттеры/сеттеры
  • Автоматически сгенерированные конструкторы
  • Атрибуты по умолчанию — могут быть инициализированы методом экземпляра.
  • Ленивые атрибуты
  • Поддержка типов атрибутов
  • Абстрактные классы
  • Интерфейсы
  • Оформление наследства
  • Статические атрибуты
  • Статические методы
  • Модификаторы атрибутов — добавьте хуки к вызову атрибута/метода перед вызовом, во время вызова или после его вызова.
  • Разрешить атрибутам быть None или нет
  • Сделать атрибуты окончательными
  • Решите, требуются ли атрибуты конструктору или нет
  • Многое другое

Я верю, что Kisa может и сделает разработку на Python более быстрой для написания, поддержки, более организованной и безопасной.

Очень простой пример класса Kisa:

import kisa

class Person(metaclass=kisa.Class):
    firstname = kisa.Info(type=str,  required=True, final=True)
    lastname = kisa.Info(type="str", required=True, final=True)
    age = kisa.Info(type=int, required=True)
    friends = kisa.Info(type=list, default=lambda: [])

    def fullname(self):
        return f"{self.firstname()} {self.lastname()}"

    def birthday(self):
        # Getter
        new_age = self.age() + 1

        # Setter
        self.age(new_age)

# # raises Exception: "firstname" is Missing in instance creation for class Person
# noam = Person()

noam = Person(firstname="Noam", lastname="Nisanov", age=22)

# raises Exception: Tried to modify a final attribute "firstname"
# noam.firstname("Generic")

# raises Exception: "age" must be of type: <class 'int'>
# noam.age("bla bla")

print(f"First name: {noam.firstname()}") # prints "First name: Noam"
print(f"Last name: {noam.lastname()}") # prints "Last name: Nisanov"
print(f"Full name: {noam.fullname()}") # prints "Full name: Noam Nisanov"

print(f"Current age: {noam.age()}") # prints "Current age: 22"
print(f"Birthday!") # prints "Birthday!"
noam.birthday()
print(f"New age: {noam.age()}") # prints "New age: 23"

Для получения дополнительной информации, пожалуйста, взгляните на проект GitHub



Спасибо
Ноам Нисанов ([email protected])