2017-05-09 9 views
0

Warum bekomme ich den Attributfehler, wenn versucht wird, die Zeichenfolge full_name auf Leerzeichen zu trennen und es zwei Variablen zuzuordnen?Python-Zeichenfolge geteilt - Attribut Fehler

class Person(object): 
    def __init__(self, full_name): 
     """Person initializer""" 
     self.first_name, self.last_name = full_name.split() 

    @property 
    def first_name(self): 
     return self.first_name 

    @property 
    def last_name(self): 
     return self.last_name 


if __name__ == '__main__': 
    swadhi = Person("Swadhikar Chandramohan") 
    print swadhi.first_name 
    print swadhi.last_name 

Fehler:

C:\Python27\python.exe C:/Users/swadhi/Documents/test/tutorial/inheritance.py 
Traceback (most recent call last): 
    File "C:/Users/swadhi/Documents/test/tutorial/inheritance.py", line 18, in <module> 
    swadhi = Person("Swadhikar Chandramohan") 
    File "C:/Users/swadhi/Documents/test/tutorial/inheritance.py", line 6, in __init__ 
    self.first_name, self.last_name = full_name.split(' ') 
AttributeError: can't set attribute 
+2

Ich glaube, Sie brauchen nur '__init__' Funktion, die Sie bereits wriiten. – itzMEonTV

+1

Ich rate Ihnen, den Parsing-Code nicht in '__init__' hinzuzufügen, sondern stattdessen' swadhi = Person ("Swadhikar Chandramohan") 'as' swadhi = Person ("Swadhikar Chandramohan" .split()) ' –

+0

@L_S: Danke. Das ist die passendste Antwort für meine Frage. –

Antwort

3

Keine Notwendigkeit der property hier mit

class Person(object): 
    def __init__(self, full_name): 
     """Person initializer""" 
     self.first_name, self.last_name = full_name.split() 

if __name__ == '__main__': 
    swadhi = Person("Swadhikar Chandramohan") 
    print swadhi.first_name 
    print swadhi.last_name 
2

Sie nicht einen Setter der Immobilie erklären haben. Daher ist die Eigenschaft schreibgeschützt und Sie können sie nicht ändern.

es zu lösen, Setter-Methoden wie folgt hinzufügen:

@property 
def last_name(self, value): 
    self._last_name = value 
@property 
def first_name(self, value): 
    self._first_name = value 
@last_name.setter 
def last_name(self, value): 
    self._last_name = value 
@first_name.setter 
def first_name(self, value): 
    self._first_name = value 
+2

Gute Antwort und Informationen finden Sie in der [Dokumentation] (https://docs.python.org/3/library/functions.html#property), insbesondere 'Der @property-Decorator verwandelt die voltage() - Methode in einen" Getter " "Für ein Read-Only-Attribut mit dem gleichen Namen" – pixis

+0

Vielen Dank @napuzba –

+0

Dies wird funktionieren, aber es wäre mehr Pythonic, nur die Eigenschaften vollständig fallen lassen, da es keinen besonderen Vorteil, sie hier zu haben. – lvc

0
class Person(object): 
    def __init__(self, full_name): 
     """Person initializer""" 
     self._first_name, self._last_name = full_name.split() 

    @property 
    def first_name(self): 
     return self._first_name 


    @property 
    def last_name(self): 
     return self._last_name 

if __name__ == '__main__': 
    swadhi = Person("Swadhikar Chandramohan") 
    print swadhi.first_name 
    print swadhi.last_name 

Wie oben erwähnt, stellen Sie sicher, auf dem Eigenschaftsnamen ein „_“ vorangestellt, wenn die Klasseneigenschaft zu definieren.