2017-05-09 17 views
0

スペースに文字列full_nameを分割して2つの変数に割り当てると、属性エラーが発生するのはなぜですか?Python string split - 属性エラー

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 

エラー:

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

ここpropertyを使用する必要はありません。 – itzMEonTV

+1

'swadhi = Person(" Swadhikar Chandramohan ")'を 'swadhi = Person(" Swadhikar Chandramohan ".split())' –

+0

@L_Sとして呼ぶ代わりに、 '__init__'に解析コードを追加しないことをお勧めします。それは私の質問のための最も適切な答えです。 –

答えて

3

私はあなたがすでにwriitenのみ `__init__`機能が必要だと思う

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

あなたは、プロパティのセッターを宣言していませんでした。 したがって、プロパティは読み取り専用であり、変更することはできません。

次のようにsetterメソッドを追加し、それを解決するには、次の

@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

丁度良い答えです。詳細については、[documentation](https://docs.python.org/3/library/functions.html#property)を参照してください。特に、@propertyデコレータはvoltage()メソッドを「getter "同じ名前の読み取り専用属性の場合" – pixis

+0

ありがとうございました@napuzba –

+0

これはうまくいくでしょうが、プロパティを完全に削除するのはもっとPythonになります。 – 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 

を上記のように、クラスのプロパティを定義するときに「_」プロパティ名に接頭辞を確認してください。

関連する問題