Problem mit Klassen und self

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
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Gar nicht. Du wirst dir etwas anderes überlegen müssen.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Definiere span (oder self.span) in einer Methode anstatt es als Klassenattribut zu definieren.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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()
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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 :)
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

@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.
Antworten