Всем привет,
Я программирую на 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])