La librairie Python pyQGIS permet à la communauté scientifique et technique maîtrisant Python d'ajouter du contenu à QGIS.
Le binding SIP crée automatiquement une librairie Python à partir de la librairie Cpp en recopiant les classes et leur méthodes. Cependant les objets Python ne sont qu'une interface qui appelle ensuite les objets Cpp.
class Rectangle: # constructeur def __init__(self, width: int, height: int): # attribut d'instances self.width = width self.height = height # méthode (une fonction qui connaît self) def area(self) -> int: return self.width * self.height
>>> rec = Rectangle(5,10) >>> rec.width, rectangle.height 5, 10 >>> rec.area() 50
Une classe définit un type d'objet. Le constructeur permet de créer une instance (un objet) de la classe en donnant des paramètres qui peuvent être stockés dans des attributs d'instances. Les objets de la classe partagent des méthodes communes, dans ses méthodes on peut accéder aux attributs de l'instance via self.
self
class Rectangle: DELTA: int = 7 # attribut de classe def __init__(self, width: int, height: int): self.width = width self.height = height def area_delta(self) -> int: area = self.width * self.height area_delta = area + self.DELTA
>>> rec1 = Rectangle(5,10) >>> rec2 = Rectangle(3,6) >>> rec1.area_delta() 57 >>> rec2.area_delta() 25
Une classe peut avoir des attributs de classe. Ce sont des objets qui sont toujours les mêmes pour chaque instance de la classe. Ici DELTA est partagé par tout les rectangles.
DELTA
class Rectangle: DELTA: int = 7 def __init__(self, width: int, height: int): self.width = width self.height = height @classmethod # méthode de classe (connait cls) def display_delta(cls) -> int: return "Delta is {delta}".format(delta=cls.DELTA)
>>> Rectangle.display_delta() "Delta is 7" >>> rec1 = Rectangle(5,10) >>> rec1.display_delta() "Delta is 7"
Une classe peut avoir des méthodes de classe. Ces méthodes ont accès aux attributs de classe mais n'ont pas accès aux attributs d'instances. Elles peuvent être utilisées depuis la classe elle même (ici Rectangle) ou par les instances (ici rec1).
Rectangle
rec1
class Rectangle: def __init__(self, width: int, height: int): self.width = width self.height = height def area(self) -> int: return self.width * self.height class Square(Rectangle): def __init__(self, side: int): super().__init__(side, side)
>>> square = Square(5) >>> square.width, square.height 5,5 >>> square.area() 25
La classe enfant Square a hérité sa méthode area() de sa classe parent Rectangle. On a pas besoin de réécrire la méthode area() pour la classe Square. La commande super permet de faire référence à la classe parent.
Square
area()
super
class Composite: def __init__(self, square: Rectangle, rectangle: Square): self.square = square self.rectangle = rectangle
>>> square = Square(5) >>> rectangle = Rectangle(3, 6) >>> composite.square.area() 25
Les attributs de classe et attributs d'instances peuvent être d'autres classes et instances. On peut donc composer des ensembles logiques en associant des classes entre elles.
Les classes utilisées principalement sont souvent héritées d'autres classes pyQGIS. Le graphique en haut de la page de documentation indique les relations d'héritages et permet de retrouver des méthodes héritées.
Les classes pyQGIS n'ont pas d'attributs d'instance elles proviennent du binding SIP avec le Cpp. Les méthodes d'instance tiennent le rôle des attributs. On peut donc naviguer de classes en classes via les méthodes.