2017-08-03 4 views
-2

私はpythonの料理本を勉強しています。 私は以下のコードを実行しようとしています。これは、Pythonのクックブックの第8章にあります。 このコードは、クラスを行った後、クラスPythonのクラスのプロパティを作る

class Person: 
    def __init__(self, first_name): 
     self.first_name=first_name 

    #getter function 
    #property 
    def first_name(self): 
     return self._first_name 

    #settier function 
    def first_name(self, value): 
     print(value, isinstance (value,str)) 
     if not isinstance(value, str): 
      raise TypeError("expected a string") 
     self._first_name=value 

    #deleter function 
    def first_name(self): 
     raise AttributeError("can not delete attribute") 

    c=Person('PETTER') 
    c.first_name(42) 

の性質についてですが、私はインスタンスを作って、私は意図的に誤った値を入力します。

私はTypeError(文字列が必要です)を取得すると予想しました。 しかし、私はしませんでした。 私のコードのどの部分を変更する必要がありますか?

+1

の詳細について@property

class Person: def __init__(self, first_name): self.first_name=first_name @property def first_name(self): return self._first_name @first_name.setter def first_name(self, value): print(value, isinstance (value,str)) if not isinstance(value, str): raise TypeError("expected a string") self._first_name=value 

@setter財産exapmle

class Temp: def __init__(self,x): self.x = x @property def x(self): return self.__x @x.setter def x(self, x): self.__x = x 

を飾る機能が欠落していますトピックをオフトピックbとして閉じます。事実SOはSolveMyExerciseForMe.comではありません –

答えて

2

私は具体的には、あなたはいくつかの作品を忘れてしまったと思います:第二def first_name(self):

上記の最初の def first_name(self):

  • @first_name.setterdef first_name(self, value):上記

  • @first_name.deleter上記

  • +0

    ありがとうございました!私はそれを解決する –

    0

    以下のコードは、予想されるエラーを表示します。

    二つの主要な問題:

    1. あなたの__init__self.first_name = first_nameを持っていました。これで、関数first_nameが上書きされます。あなたはself._first_name = ...を意味しました。
    2. 同じ関数を3回(first_name)定義しました。 Pythonには関数のオーバーロードがないので、これを行うことはできません。私は最後の定義が勝つと信じています。以下では、私があなたが実際に呼びたいとは思わない2つの機能をコメントアウトしました。
    3. インデントエラーが発生しました...あなたの2つの最終行は、おそらくクラス定義内にあるため、実行されていない可能性があります。

    "ワーキング" コード:

    class Person: 
        def __init__(self, first_name): 
         self._first_name = first_name 
    
        #getter function 
        #property 
        # def first_name(self): 
        #  return self._first_name 
    
        #settier function 
        def first_name(self, value): 
         print(value, isinstance (value,str)) 
         if not isinstance(value, str): 
          raise TypeError("expected a string") 
         self._first_name=value 
    
        #deleter function 
        # def first_name(self): 
        #  raise AttributeError("can not delete attribute") 
    
    c = Person('PETTER') 
    c.first_name(42) 
    

    EDIT

    他の答えはあなたの質問のコンテキストに基づいて、指摘するように、あなたはおそらくfirst_name実際のプロパティを作成しようとしています@propertyデコレータを介して。これはおそらくコードを動作させるためのより良い方法ですが、これにより、既存のコードで何が起きているのかを理解するのに役立ちます。

    0

    あなたは、私が投票していますproperty in python

    +0

    ありがとう!私はそれを解決する! –

    +0

    @junghyemin wlcm – Kallz

    関連する問題