Zitat von
OpOs
ich finde, die objektorientierung ist lausig implementiert. bei methodenaufrufen musst du immer die objektreferenz mit angeben, auch attribute lassen sich nur ueber "self" ansprechen.
Das macht aber auch Sinn. In C++ und Java wird "self" ja immer implizit übergeben (dort heisst es this). Da bei Python Variablen nicht deklariert werden, muss die Referenz auf self immer angegeben werden, damit man zwischen (Methoden-)lokalen und Instanzvariablen unterscheiden kann. Desweiteren ist es notwendig, weil du Methoden dynamisch hinzufügen (oder löschen) kannst:
Beispiel:
Code:
class A(object):
def foo(self):
print "hier ist foo"
# Klassendefinition ist hier zuende
def blabla(self):
print "Ich rufe mal foo auf"
self.foo()
def neues_foo(self):
print "Ich bin der neue Foo"
a = A()
A.bar = blabla
a.bar() # Ausgabe: Ich rufe foo auf, hier ist foo
a.foo() # hier ist foo
b = A()
b.foo = neues_foo
b.foo(); a.foo() # neues foo, foo
old_foo = A.foo
A.foo = neues_foo
a.foo() # neues foo
old_foo(a) # ruft altes foo auf
es gibt kein public/protected/private. es gibt zwar eine moeglichkeit, methoden und attribute private zu deklarieren, das iss aber auch nur 'ne hintertuerchenloesung.
Das stimmt. Das ist per design. Python geht davon aus, das der Programmierer weiss, was er tut und dass er sich an Konventionen hält. Z.B. sind Methoden, die mit einem _ beginnen, Klassenintern und nicht als Teil der API zu betrachten. Wenn man sie aber unbedingt aufrufen will, kann man es tun, sollte sich aber nicht wundern, wenn das Programm mit späteren Versionen der API nicht geht.
Meistens braucht man auch private nicht, da die Sachen anders gelöst sind.
Beispielsweise nutzt man in C++ und Java oft getter und setter-Methoden.
Beispiel
Code:
class Kreis {
private int durchmesser;
public int getDurchmesser() {
return durchmesser;
}
public void setDurchmesser(int durchmesser) {
this.durchmesser = durchmesser;
}
Wenn man also auf bar zugreifen möchte, muss man mit get/set arbeiten. Der Gedanke dahinter ist einfach: Sollte man irgendwann mal seine Klasse so umschreiben, dass sie mit dem Radius arbeitet, laufen alte Programme wie gewohnt weiter, da man einfach die getter/setter entsprechend anpassen würde. Würde jemand direkt auf umfang zugreifen, wäre ein Wechsel nicht so einfach möglich.
In Python kann man jedoch den Zugriff auf eine Variable abfangen, so man denn will. Nehmen wir an, die Klasse Kreis hatte früher eine Variable durchmesser, die man einfach benutzen konnte
Code:
class Kreis(object):
def __init__(self):
self.durchmesser = 0
def tu_irgendwas(self):
# hier macht man irgendwas
k = Kreis()
k.durchmesser = 4
k.tu_irgendwas()
Wenn man nun auf Radius umstellt, macht man
Code:
def Kreis(object):
def __init__(self):
self.radius = 0
def get_durchmesser(self):
return self.radius*2
def set_durchmesser(self, durchmesser):
self.radius = durchmesser/2
durchmesser = property(get_durchmesser, set_durchmesser)
Ein
Code:
kreis.durchmesser = 5
setzt nun den Radius auf 2,5, alter Code ist weiterhin lauffähig.
Aus diesem Grund bräuchte man private und co. eigentlich so gut wie nie.
und es gibt keinen klaren styleguide
Und ob!
Style Guide for Python Code
Lesezeichen