Seite 1 von 1

Problem mit Klassen und self

Verfasst: Donnerstag 23. April 2009, 19:41
von bremer
Das will nicht funktionieren. Wie soll ich sonst auf self.coords zugreifen???

Code: Alles auswählen

class Area:
    def __init__(self, x, y):
        self.coords = list(_product(x, y))
    span = min(self.coords), max(self.coords)
...
class Area:
File "C:\Program Files\Python30\lib\site-packages\hyp.py", line 15, in Area
span = min(self.coords), max(self.coords)
NameError: name 'self' is not defined

Verfasst: Donnerstag 23. April 2009, 19:45
von DasIch
Gar nicht. Du wirst dir etwas anderes überlegen müssen.

Verfasst: Donnerstag 23. April 2009, 20:00
von derdon
Definiere span (oder self.span) in einer Methode anstatt es als Klassenattribut zu definieren.

Verfasst: Donnerstag 23. April 2009, 20:04
von numerix
Darüber kannst du ja mal nachdenken und dann einen neuen Versuch starten:

Code: Alles auswählen

from random import randrange

class Area(object):

    def __init__(self, x, y):
        self.coords = [randrange(x,y) for k in xrange(20)]

    def span(self):
        return min(self.coords), max(self.coords)


area = Area(10, 500)
print area.span()

Verfasst: Donnerstag 23. April 2009, 20:10
von derdon
Mein Wörterbuch sagt mir, dass span keine Methode sein kann, sondern eine Eigenschaft eines Objektes beschreibt. Man kann also span als ein property definieren, ich würde aber self.span einfach in __init__ definieren, um es nicht unnötig kompliziert zu machen.

Verfasst: Donnerstag 23. April 2009, 20:47
von numerix
derdon hat geschrieben:Mein Wörterbuch sagt mir, dass span keine Methode sein kann, sondern eine Eigenschaft eines Objektes beschreibt. Man kann also span als ein property definieren, ich würde aber self.span einfach in __init__ definieren, um es nicht unnötig kompliziert zu machen.
"to span" ist auch ein Verb ...

Wenn self.coords unverändert bleibt, dann würde ich deinem letzten Vorschlag ebenfalls den Vorzug geben.

Verfasst: Freitag 24. April 2009, 15:23
von derdon
numerix hat geschrieben:
derdon hat geschrieben:Mein Wörterbuch sagt mir, dass span keine Methode sein kann, sondern eine Eigenschaft eines Objektes beschreibt. Man kann also span als ein property definieren, ich würde aber self.span einfach in __init__ definieren, um es nicht unnötig kompliziert zu machen.
"to span" ist auch ein Verb ...
Ah, wieder was gelernt :)

Verfasst: Freitag 24. April 2009, 18:02
von str1442
@bremer: Alles, was man in der ersten Einrückungsebene bei einer Klassendefinition schreibt, gehört zur Klasse, das ist ein eigener Namensraum. self existiert da nicht. Da dieser Raum direkt evaluiert wird bei Antreffen einer Definition existiert er nur kurzzeitig, danach hat man eben die Klasse. Diese wird erst nach Auswertung erstellt, weswegen es dort auch kein "cls" Attribut gibt (was aber auch überflüssig wäre, schließlich gibts classmethod / staticmethod und ein explizites cls würde sich nicht so gut wie das self begründen lassen).

Das bedeutet auch, das man dort alles Notwendige tun kann, diese Klasse zu definieren. Zb auch sowas:

Code: Alles auswählen

import random

class A(object):
    def _generate_std_value():
        return random.randint(0, 101)

    my_classvar = _generate_std_value()
    del _generate_std_value
Diese Funktion wird in der Klasse nicht auftauchen. Über die Sinnhaftigkeit lässt sich natürlich streiten.

Außerdem ist deine ursprüngliche Herangehensweise etwas seltsam. Du willst der Klasse ein (klassen)globales Attribut zuweisen (das aber nur bei Klassenerstellung definiert wird), das aber mit der Instanz zu tun hat und bei jedem __init__ definiert wird? Das hat doch alles gar nichts miteinander zu tun.