2017-01-08 4 views
0

Ich versuche ein einfaches Spiel zu schreiben und muss einige Informationen in eine Datei schreiben. Dies ist, wie der Code sieht aus wie bisher:Versuche, Strings in einer Datei mit einer Klassenfunktion zu schreiben

class Player: 
    def __init__(self, name, password, file): 
     with open(file) as inputFile: 
      self.playerAndPw = inputFile.read() 
     self.name = name 
     self.password = password 


    def add(self, name, password, file): 
     file.write(name + " | " + password) 


    def __str__(self): 
     print("The player's name is called " + self.name + "\n") 

print("Welcome to Guess My Number!") 
start = input("Press 1 for New Account, 2 for Log In: ") 

if start == "1": 
    player = Player 
    playerID = input("Enter a name: ") 
    playerPassword = input("Enter a password: ") 
    fileName = "PlayerAndPassword.txt" 
    player.add(playerID, playerPassword, fileName) 

In der letzten Zeile gibt es eine Ausnahme bei der letzten Klammer. „Parameter‚Datei‘ungefüllt So ist der Code nicht die Informationen der Funktion erhalten kann ich verwende in der letzten Zeile.

Wäre toll, wenn mir jemand helfen könnte! Thank you!

+1

Warum lesen möchten sind vorbei Sie 'Name ',' password' und 'file' als Parameter zu' Player.add', wenn Sie diese bereits an den Klassenkonstruktor übergeben haben? – Tagc

+3

Auch die Zeile 'player = Player' initialisiert keine neue Instanz von' Player'. Dazu brauchst du 'player = Player (...)' und gibst die benötigten Argumente ein. – Tagc

+1

, aber Sie können die Argumente nicht übergeben, da Sie eine Datei eingeben müssen. Sieht so aus, als ob dein Design fehlerhaft ist: Du kannst keinen Konstruktor mit einem Dateiargument erstellen, weil das bedeuten würde, dass du niemals einen _new_ Player erstellen kannst. Bessere laden/speichern Methoden, und verwenden Sie Json zu serialisieren/unserialisieren ... –

Antwort

1

das ist mein Versuch ist der Code, so gut zu korrigieren, könnte ich. wie bereits ausgeführt in die Kommentare, müssen Sie player zu einer Instanz der Player clas s durch Instantiierung als player = Player(...).

Da Sie den Namen, das Kennwort und die Datei des Players übergeben, um Anmeldeinformationen im Player-Konstruktor zu speichern, müssen Sie diese nicht als Argumente an Player.add übergeben, weshalb ich alle Parameter dafür entferne.

Ich sollte darauf hinweisen, dass diese Implementierung sehr einfach und unvollständig ist, nur um Ihre unmittelbaren Probleme zu adressieren. Meine Implementierung führt dazu, dass Dateihandles nach jedem Aufruf des Player-Konstruktors geöffnet bleiben. Wenn Sie für diese Art von Ansatz entscheiden, können Sie the Python documentation on input and output operations.

class Player: 
    def __init__(self, name, password, fileName): 
     self.name = name 
     self.password = password 
     self.file = open(fileName, mode='a') 

    def add(self): 
     self.file.write(self.name + " | " + self.password + '\n') 

    def __str__(self): 
     print("The player's name is called " + self.name + "\n") 


print("Welcome to Guess My Number!") 
start = input("Press 1 for New Account, 2 for Log In: ") 

if start == "1": 
    playerId = input("Enter a name: ") 
    playerPassword = input("Enter a password: ") 
    fileName = "PlayerAndPassword.txt" 
    player = Player(playerId, playerPassword, fileName) 
    player.add() 

Konsolenausgabe

Welcome to Guess My Number! 
Press 1 for New Account, 2 for Log In: 1 
Enter a name: Tom 
Enter a password: Foo 

Welcome to Guess My Number! 
Press 1 for New Account, 2 for Log In: 1 
Enter a name: Dick 
Enter a password: Bar 

Welcome to Guess My Number! 
Press 1 for New Account, 2 for Log In: 1 
Enter a name: Harry 
Enter a password: Baz 

PlayersAndPasswords.txt

Tom | Foo 
Dick | Bar 
Harry | Baz 
+0

Beachten Sie, dass dieser Ansatz ein offenes Dateihandle belässt und ich persönlich JSON hier verwenden würde. JSON hat den Vorteil, dass es bereits eine Serialisierung eingebaut hat und einige Dinge viel einfacher macht (zB Player-Lookup). – MSeifert

+0

@MSeifert Sie liegen nicht falsch und ich füge das zu meiner Antwort hinzu, da es ein guter Punkt ist. Wenn Sie ein offenes Datei-Handle belassen, wirkt sich das nicht auf die Korrektheit dieses Programms aus. Die Absicht meiner Antwort war nur, die unmittelbaren Probleme von OP zu lösen. – Tagc

+0

@ErikaWorm Ich bin froh, dass ich geholfen habe, aber auf Stack Overflow [Abstimmung über und die Annahme von Antworten, die Ihr Problem lösen, werden gegenüber Dankeskommentaren bevorzugt.] (Http://stackoverflow.com/help/someone-answers) – Tagc

0
class Player: 
    def __init__(self, name, password, file): 
     self.name = name 
     self.password = password 
     self.file = open(file, mode='a') #first assign file to self.file(referring to this file) 


    def add(self): #need to add those parameters as they are already initialized by constructor 
     self.file.write(self.name + " | " + self.password) 


    def __str__(self): 
     print("The player's name is called " + self.name + "\n") 

print("Welcome to Guess My Number!") 
start = input("Press 1 for New Account, 2 for Log In: ") 

if start == "1": 
    playerID = input("Enter a name: ") 
    playerPassword = input("Enter a password: ") 
    fileName = "PlayerAndPassword.txt" 
    player = Player(playerID, playerPassword, fileName) #create instance with said values 
    player.add() #call the add function to add 
+0

Ja, ich habe Kommentare verwendet. – Inconnu

+0

Ahh ja, habe es überprüft und jetzt funktioniert es. – Inconnu

Verwandte Themen