Global local __privat?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bernd

Halli, hallo!

Habe (vermutlich) ein Problem mit den Namensräumen von Variablen.

Folgende Problemstellung:

Es gib die zwei Objekte A und B mit ihren Variblen=Attributen der Klasse K. Wenn ich Python bis hierhin richtig verstehe, haben die Klassenfunktionen als estes Attribut immer eine Klasseninstance (self, this).

Wenn mit den beiden Objekten A und B arbeiten möchte kann ich entweder
die eine Instance zum aufrufen einer Klassenfunktion und das andere als Paramter verwenden, oder ich benutzt eine Fukntion die beide Objekte als Parameter benutzt.

Beispiel vergleiche zwei Punkte: A.equals(B) oder equals(A,B)

Jetzt bringe ich noch einen Toleranz T in Spiel, in deren Abhängigkeit der Vergleich ausgewertet wird.

Beispiel:

Code: Alles auswählen

class K:

def equals(self, other,tol): irgendetwas

def equals(x,y,tol):  irgendetwas

A.equals(B,T) oder equals(A,B,T)
Mir wäre es aber lieber ich würde T ein mal als Klassenvaribele definieren.
Die Funktion fragt diese dann einfach ab. Da T aber nicht wie Math.Pi eine Konstante sein sollen, sondern bei Bedarf geänder werden kann, stehe ich vor einen Problem. Ich möcht T nicht ohne weiteres als global defineren,
da ich sorge habe sie konnte ungewollte geändert werden - wie weit lasse ich mit einer solchen Definition die Hosen im Namensraum runter?

Code: Alles auswählen

__Tol=10**-3

def setTol(value): __Tol=value
Ich hatte auch schon nach einer Anregung hier im Forum die Definition einer Funktionsvaribalen versucht, die über einer Zugriffsfunktion abgesprochen werden könnte - leider haut das (noch) nicht hin.

Code: Alles auswählen

def equals(): 
if x<=equals.tol: irgendetwas

def setTol(value): equals.tol=value
Auslagern in eine anderes Klasse oder ein extra Modul wollte ich das ganze nicht, da ich meine diese Funktionen gehören zu der Klasse der Objekte A und B.

Kann mir hier jemand helfen bzw. einen Hinweise in Form einer guten Doku für diese Problematik geben?

Grüße Bernd
Bernd

Sorry - meine Anfrage ist mir offensichtlich in die falsche Rubrik geraten,
sollte eigenlich unter Allgemeines geposted werden.

Wenn das bitte jemand entsprechend ändern könnte - Danke

bis bald
Bernd
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Bernd,

Code: Alles auswählen

class K(object):
    def equals(self, other, tol=1.0e-3):
        return abs(self-other) <= tol

def equals(a, b, tol=1.0e-3):
    return abs(a-b) <= tol
so hat tol einen vorgegebenen Wert, der auch als zusätzlicher Parameter redefiniert werden kann.


Gruß

Dookie
Gast

Hallo Dookie,

diese Lösung ist mir bekannt, trotzdem danke. Ich wollte tol aber nicht jedesmal übergeben, sondern einmalig für alle Instanzen von class K festlegen.

Code: Alles auswählen

class K(object):

tol=1.0e-3 #gültig für alle K-Instancen

def set_tol(value): 
     tol=value #wie rufe ich diese Funktion dann auf?

def equals(self, other):
     return abs(self-other)<=tol#hier liegt der Hase im Pfeffer


Hier hat leider der Zugriff auf auf tol nicht hin. Wie weit lasse ich mit global tol die Hosen runter? Tol soll nur in class K gültig sein und hierüber beinflußt werden können.

Grüße aus Hannover
Bernd
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Ich würde es ganz anders machen, nämlich die Funktion equals einfach als Synonym für die Klassenmethode setzen. Dann kann in der Klasse T beliebig gesetzt werden und es ist deiner Funktion egal:

Code: Alles auswählen

class K(object):
    __tol=1.0e-3
    def equals(self,other,tol=__tol):
        #mache was...

equals=K.equals
Das kommt an Dookie Lösung in etwa ran, denn seine Lösung erfüllt ja auch bereits deine Bedingung "Ich wollte tol aber nicht jedesmal übergeben, sondern einmalig für alle Instanzen von class K festlegen". Das ist in jedem Fall gegeben, da tol ja ein vorgegebener Parameter ist. Dieser kann übergeben werden muss aber nicht. In jedem Fall haben aber alle Instanzen von K denselben vorgegebenen Parameter (wär ja schlimm, wenn nicht).

Milan
Bernd

Danke Milan,

das könnte es sein - werde mich damit weiter versuchen.

Bei Erfolg kommt Rückmeldung.

Bis bald
Bernd

PS: Wie ist das mit Korrektur der Rubrik? Installation ist ja wohl nicht richtig oder?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Wegen der Rubrik musst du mal Piddon fragen (geht leider schlecht als Gast, ich schick ihm eine PN), da außer ihm niemand in den nicht-Programmierforen Moderatorrechte hat.

Milan
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Code: Alles auswählen

class K(object):
    __tol = 1.0e-3 #Klassengebundene Variable
    def equals(self, other):
        return abs(other - self) <= self.__tol

Gruß

Dookie

P.S.: Ich hab das Thema gerade nach Allgemeines verschoben.
Antworten