Überschreiben von len in __init__.py - python

8

Ich möchte eine andere Funktion in __init__.py file meines Pakets auf folgende Weise len:

%Vor%

Es funktioniert gut, aber nur in der Datei __init__.py . Wie kann ich andere Module in meinem Paket beeinflussen?

    
DorianOlympia 01.11.2015, 14:37
quelle

2 Antworten

2

Wenn Sie versuchen, einen Namen zu laden, der nicht als global auf Modulebene oder lokal als Funktion definiert ist, sucht Python im Modul __builtin__ ( builtins in Python 3) nach einem Namen. In beiden Versionen von Python ist dieses Modul auch als __builtins__ im globalen Gültigkeitsbereich verfügbar. Sie können dieses Modul ändern und das wird nicht nur Ihren Code beeinflussen, sondern auch irgendeinen anderen Python-Code, der ausgeführt wird, nachdem Ihr Code ausgeführt wurde !!

%Vor%     
ppperry 05.11.2015, 12:55
quelle
4

Das mag nicht die Antwort sein, die du suchst, aber ich würde das nicht tun, wenn ich du wäre (und ich bin mir ziemlich sicher, dass du es sowieso nicht leicht kannst).

Der Grund, warum Sie das nicht sollten, ist, dass Python len intern für seine Objekte verwendet, um bestimmte Operationen auszuführen. Ein anderer Grund ist reine gebrochene Logik. Ihre len -Funktion, die oben definiert wurde, würde eine negative Länge für leere Listen oder leere Dinge zurückgeben. Das scheint mir ziemlich kaputt zu sein.

Was Sie tun können , überschreibt die Längenmethode nur für bestimmte Klassen (dies könnte für Sie sehr sinnvoll sein). Dazu können Sie das Überladen von Operatoren verwenden, überschreiben Sie einfach die Methode __len__ in Ihrer Klasse:

%Vor%

Sie können auch in Meta-Klassen schauen, es gibt einen sehr guten Stack-Überlauf Frage zu diesem Thema.

    
nichochar 01.11.2015 16:36
quelle