2017-03-05 1 views
0

ist Ich habe eine Klasse wie:Kann Zugriff auf Klassenvariable nicht zu drucken, wie es NoneType Objekt

class MP3: 
    name = "" 
    capacity = 0 
    def newMP3(name, capacity): 
     MP3.name = name 
     MP3.capacity = capacity 

Mein Haupt Skript:

from mp3class import * 
currentMP3 = MP3.newMP3("myName", 10) 
print (currentMP3.name) 
print (currentMP3.capacity) 

jedoch kehren die print-Anweisungen einen Fehler:

AttributeError: 'NoneType' object has no attribute 'name' 

Warum ist currentMP3 == None wenn ich es gerade zugewiesen habe?

Ich habe return (name, capacity) am Ende class MP3 versucht und das gibt mir einen anderen Fehler:

AttributeError: 'tuple' object has no attribute 'name' 

Auch wenn das Tupel name in es hat?

Antwort

3

Sie Rückkehr None implizit nach dem Aufruf:

def newMP3(name, capacity): 
    MP3.name = name 
    MP3.capacity = capacity 

und es auf den Namen currentMP3 zuweisen.

Sie suchen entweder für __init__ eine neue Instanz mit einigen Attributen zu initialisieren:

def __init__(self, name, capacity): 
    self.name = name 
    self.capacity = capacity 

oder, als Alternative, können Sie die Klasse ändern Attribute direkt und dann eine neue Instanz mit @classmethod erstellen:

@classmethod 
def newMP3(cls, name, capacity): 
    cls.name = name 
    cls.capacity = capacity 
    return cls() 
0

Ihre newMP3 Methode in Ihrer Klasse gibt nichts zurück. In Python ist das das Gleiche wie die Rückkehr None. Wenn Sie also currentMP3 = MP3.newMP3(...) tun, wird currentMP3 zu None und hat keinen Zugriff auf die Klassenattribute, die Sie für die Klasse MP3 festgelegt haben.

Beachten Sie, dass die Verwendung von Klassenattributen und keine Instanzen sehr merkwürdig ist. Ich würde viele andere Fehler erwarten, wenn Sie diesen Weg weitergehen. Eine wesentlich natürlichere Implementierung würde eine Instanz der Klasse MP3 erstellen und Attribute für die Instanz festlegen.

Verwandte Themen