2016-09-01 9 views
0

Beim Versuch, den Befehl listPersons() auszuführen, sollte jede Person/Instanz die sayHello() -Methode aufrufen. Aber da die Namen str sind, würde es einen AttributeError auslösen (siehe unten).Wie formatiere ich eine Zeichenfolge für eine Methode in Python?

Wie formatiere ich die Namen, damit ich die Methoden auf ihnen verwenden kann?

class person: 
    def __init__ (self, name): 
     self.name = name 
    def sayHello(self): 
     print("Hello World, I'm", self.name) 

def listPersons(): 
    print ("There are", len(names), "persons here, please everybody say hello to the world!") 

    for name in names: 
     print(name.sayHello()) 

names = ["Tobias", "Lukas", "Alex", "Hannah"] 

for name in names: 
    globals()[name] = person(name) 

Attribute:

Traceback (most recent call last): 
File "<pyshell#97>", line 1, in <module> 
listPersons() 
File "/Users/user/Desktop/test.py", line 12, in listPersons 
print(name.sayHello()) 
AttributeError: 'str' object has no attribute 'sayHello' 

Vielen Dank für Ihre Hilfe! :-)

+0

Ich kopiere diesen Code eingefügt und bin kein Fehler immer in beiden Python 2 und 3 – idjaw

Antwort

2

Sie erhalten diesen Fehler, weil Names-Liste eine Liste von Zeichenfolgen ist, nicht die Personenobjekte, die Sie erstellen. Da Sie globals() verwenden, wird jeder Person eine Variable im globalen Gültigkeitsbereich zugewiesen. Anstatt globals() zu verwenden, würde ich vorschlagen, eine Liste von Leuten zu haben.

Ein anderes Problem, dass Sie versuchen werden, die Ausgabe von person.sayHello zu drucken, aber das gibt nichts zurück. Sie könnten stattdessen die Funktion aufrufen.

Beiden Änderungen zusammen:

class person: 
    def __init__ (self, name): 
     self.name = name 
    def sayHello(self): 
     print("Hello World, I'm", self.name) 

def listPersons(): 
    print ("There are", len(people), "persons here, please everybody say hello to the world!") 

    for name in people: 
     name.sayHello() 

names = ["Tobias", "Lukas", "Alex", "Hannah"] 
people = [] 

for name in names: 
    people.append(person(name)) 
+0

Vielen Dank für Ihre hilfreiche Antwort und Erklärung! Aber gibt es eine Möglichkeit, die Instanzen so zu erstellen, dass ich Tobias.sayHello() noch aufrufen kann? – tobiaspk1

+0

löste es durch folgende Zeile nach people.append (person (name)): globals() [people [i] .name] = people [i]! Ist das ein gültiger Weg, es zu lösen? – tobiaspk1

+0

Ich würde von der Verwendung von Globals abraten, da es eine runde Möglichkeit ist, Variablen zu erstellen oder darauf zuzugreifen. Wenn ich Tobias.sayHello() sehe, erwarte ich eine Zeile wie Tobias = Person ("Tobias"). Die Verwendung von globals() auf diese Weise, macht den Code weniger lesbar, könnte Sie für andere Fehler öffnen. Zum Beispiel, wenn die Namensliste die Werte "person" hat. Eine andere Alternative würde ich vorschlagen, die Leute in einem Wörterbuch zu speichern. Etwas wie Leute = {}, dann Leute [Name] = Person (Name). Dann könntest du Leute machen ["Tobias"]. SayHello(). – PYOak

Verwandte Themen