private-Konvention in Python
Verfasst: Samstag 9. Oktober 2021, 11:36
hallo zusammen,
ich möchte gern richtig verstehen, wie "private" innerhalb von Python funktioniert.
Das Konzept hinter "private" ist mir klar. Ich kenne es bereits aus anderen Programmiersprachen.
Ich ziele explizit auf die Syntax ab und wähle im folgenden Code daher auch metasyntaktische Variablennamen.
Aus diversen Tutorials habe ich entnommen, dass private-Methoden durch zwei Underscores definiert werden. Also per Konvention. (z.B. hier https://draeger-it.blog/python-15-priva ... -methoden/)
Hier mal zwei Code-Schnipsel, die zu denen ich eine Frage habe:
liefert folgende Meldung
soweit so gut.
Aber nun zu meiner Frage:
Warum liefert der nachfolgende Code _keine_ Fehlermeldung?
Da __sizeof__ ja auch mit zwei Underscores beginnt, würde ich erwarten, dass hier ebenfalls eine Fehlermeldung kommt.
ich habe mir auch mal die Methode per "STRG+Klick-Ansprung" angeschaut. Aber ich erkenne dort nichts, was mir die Frage evtl. beantworten könnte.
Ebennfalls habe ich ausprobiert, ob es ggf. an den "endenden" Underscores liegt. Aber dies scheint auch nicht der Fall zu sein.
Ich danke Euch schon mal im Voraus, wenn ihr mich hier ein wenig erhellen könntet.
Ich freue mich auch,, wenn ihr mir ein Stichwort nennt, was ich googeln kann, um es selbst herauszufinden.
ich möchte gern richtig verstehen, wie "private" innerhalb von Python funktioniert.
Das Konzept hinter "private" ist mir klar. Ich kenne es bereits aus anderen Programmiersprachen.
Ich ziele explizit auf die Syntax ab und wähle im folgenden Code daher auch metasyntaktische Variablennamen.
Aus diversen Tutorials habe ich entnommen, dass private-Methoden durch zwei Underscores definiert werden. Also per Konvention. (z.B. hier https://draeger-it.blog/python-15-priva ... -methoden/)
Hier mal zwei Code-Schnipsel, die zu denen ich eine Frage habe:
Code: Alles auswählen
class Foo():
def __init__(self):
self.__baz = 1
def __baz__(self):
self.__baz = self.__baz + 1
foo = Foo()
foo.__baz()
Code: Alles auswählen
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-32-a0f99160f6ab> in <module>()
7
8 foo = Foo()
----> 9 foo.__baz()
AttributeError: 'Foo' object has no attribute '__baz'
Aber nun zu meiner Frage:
Warum liefert der nachfolgende Code _keine_ Fehlermeldung?
Da __sizeof__ ja auch mit zwei Underscores beginnt, würde ich erwarten, dass hier ebenfalls eine Fehlermeldung kommt.
Code: Alles auswählen
import pandas as pd
data = [['Ham', 1],
['Spam', 2],
['Eggs', 3],
]
df = pd.DataFrame(data, columns=['bar', 'quz'])
print(df.__sizeof__())
Ebennfalls habe ich ausprobiert, ob es ggf. an den "endenden" Underscores liegt. Aber dies scheint auch nicht der Fall zu sein.
Code: Alles auswählen
def __sizeof__(self):
"""
Generates the total memory usage for an object that returns
either a value or Series of values
"""
if hasattr(self, "memory_usage"):
mem = self.memory_usage(deep=True)
return int(mem if is_scalar(mem) else mem.sum())
# no memory_usage attribute, so fall back to object's 'sizeof'
return super().__sizeof__()
Ich danke Euch schon mal im Voraus, wenn ihr mich hier ein wenig erhellen könntet.
Ich freue mich auch,, wenn ihr mir ein Stichwort nennt, was ich googeln kann, um es selbst herauszufinden.