Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Python

Python Attrs:Erweiterte Datenklassen mit Beispielcode

Mit dem Paket Python Attrs können Sie erweiterte Datenklassen mit einfachen Annotationen erstellen. Natürlich hat Python auch ein eigenes natives Datenklassenmodul, aber das Python attrs-Paket bietet ein paar zusätzliche Funktionen, die Ihnen gefallen könnten!

Inhaltsverzeichnis

Attribute installieren

Das attrs-Paket ist nicht Teil der Basisbibliothek, daher müssen Sie es mit dem Befehl pip install oder etwas Ähnlichem wie Pipenv installieren. Wahrscheinlich möchten Sie auch eine virtuelle Umgebung erstellen, damit sie andere Projekte, die Sie haben, nicht stört. Das Paket heißt attrs, die Installation sieht also so aus:

$ pip install attrs

# or with pipenv:
$ pipenv install attrs

Attrs vs. Datenklassen

Die Autoren von attrs haben tatsächlich an dem PEP gearbeitet, das Datenklassen in Python eingeführt hat. Die nativen Datenklassen von Python sind absichtlich einfacher und leichter verständlich gehalten, während attrs die gesamte Bandbreite an Funktionen bieten, die Sie sich wünschen könnten!

Einige der Gründe, sich für Python attrs zu entscheiden über die eingebauten Datenklassen sind:

Ein einfaches Beispiel für Python-Attribute

Schauen wir uns zuerst ein sehr einfaches Beispiel an:

import attr

@attr.s
class Person(object):
    name = attr.ib(default='John')
    surname = attr.ib(default='Doe')
    age = attr.ib(init=False)
    
p = Person()
print(p)
p = Person('Bill', 'Gates')
p.age = 60
print(p)

# Output: 
#   Person(name='John', surname='Doe', age=NOTHING)
#   Person(name='Bill', surname='Gates', age=60)

Ein paar Beobachtungen:

Sehen wir uns als Nächstes die wichtigsten Funktionen an, die dieses Paket gegenüber regulären Datenklassen bietet:Validatoren und Konverter.

Beispiel für einen Python-Attr-Validator

Sie können Ihrer attrs-Datenklasse auf zwei Arten Validatoren hinzufügen:

  1. Einen Dekorateur verwenden
  2. Durch Bereitstellen einer aufrufbaren Funktion

Ich werde hier zuerst die Callable-Function-Methode demonstrieren. Attrs bietet mehrere sofort einsatzbereite Validatoren, von denen wir den instance_of verwenden validator im folgenden Beispiel:

>>> @attr.s
... class C(object):
...     x = attr.ib(validator=attr.validators.instance_of(int))
>>> C(42)
C(x=42)
>>> C("a string")

Traceback (most recent call last):
   ...
TypeError: ("'x' must be <type 'int'> (got 'a string' that is a <type 'str'>).", ...

Da wir versucht haben, ein Objekt C mit einem String-Wert für x zu erstellen, gibt der instance_of-Validator einen Fehler aus, weil er einen int-Typ anstelle eines Strings erfordert.

Lassen Sie uns nun unseren eigenen Validator definieren:

import attr

@attr.s
class DividableByTwo(object):
    x = attr.ib()

    @x.validator
    def check(self, attribute, value):
        if value % 2 != 0:
            raise ValueError(f'{value} is not dividable by 2')

print (DividableByTwo(60))
print (DividableByTwo(11))

# Output will be something like:
# DividableByTwo(x=60)
# ...
# ValueError: 11 is not dividable by 2

Beispiel für einen Python-attrs-Konverter

Ein Konverter übernimmt den eingestellten Wert und rechnet ihn automatisch um. Sie können dies für alle möglichen Zwecke verwenden. Ein Beispiel ist die automatische Konvertierung eines Werts in eine Ganzzahl. Beginnen wir wieder mit der Verwendung einer aufrufbaren Funktion, in diesem Fall verwenden wir einfach die int()-Funktion von Python:

import attr

@attr.s
class C(object):
    x = attr.ib(converter=int)

c = C("1")
print(c)
# Output:
# C(x=1)

Unsere Eingabe (die Zeichenfolge „1“) wurde automatisch in eine Ganzzahl umgewandelt. Da Konverter vor Validatoren ausgeführt werden, können Sie den endgültigen Wert nach der Konvertierung validieren. Beispielsweise könnten Sie die beiden obigen Beispiele verwenden, um zuerst eine beliebige Eingabe in int umzuwandeln und dann zu prüfen, ob der Wert durch zwei teilbar ist.

Slots mit Python-Attributen verwenden

Schließlich können Sie attrs anweisen, Slotted-Klassen zu verwenden. Slotted-Klassen haben einige Vorteile gegenüber regulären Klassen:

Kurz gesagt, mit einer Slotted-Klasse geben Sie explizit an, welche Instanzattribute Sie von Ihren Objektinstanzen erwarten. Auf diese Weise kann Python einige Überprüfungen und dergleichen weglassen, was zu weniger Speicherverbrauch und leichten Geschwindigkeitssteigerungen führt. Weitere Details finden Sie in der attrs-Dokumentation hier.

Slot-Klassen sind jedoch auch mit Einschränkungen verbunden, insbesondere wenn Sie sie manuell erstellen. Glücklicherweise bietet uns attrs eine einfache Möglichkeit, die Funktion zu aktivieren:

import attr

@attr.s(slots=True)
class YourClassName:
    ...

Weiter lernen


Python

  1. Python-Datentypen
  2. Python String strip() Funktion mit BEISPIEL
  3. Python String count() mit BEISPIELE
  4. Python-Funktion round() mit BEISPIELE
  5. Python map() Funktion mit BEISPIELE
  6. Python Timeit() mit Beispielen
  7. Python-Zähler in Sammlungen mit Beispiel
  8. Python time.sleep():Verzögerung zu Ihrem Code hinzufügen (Beispiel)
  9. Python List count() mit BEISPIELE
  10. Python List index() mit Beispiel