2017-11-28 20 views
2

私はPythonにはまったく新しく、クラスは2つの属性(1つは数値、もう1つはdatetimeオブジェクト)を格納するクラスを作成しようとしています。私も好きですが、dateをdatetimeとして保存している間は、 "dd.mm.yyyy"のような文字列を使用して初期化して出力します。 self.datePythonでのゲッターとセッター

class MyClass: 
    number = None 
    date = None 

    def __init__(self, params): 
     self.number = params["number"] 
     self.date = params["date"] 

    @property 
    def date(self): 
     return datetime.datetime.strftime(self.date, '%d.%m.%Y') 

    @date.setter 
    def date(self, value): 
     self.date = datetime.datetime.strptime(value, '%d.%m.%Y') 

    def get_vars(self): 
     return vars(self) 

しかし、実行時に@propertyポイントと言う:だから私は行くExpected type 'datetime', got 'str' instead。設定中に日付に変換されることを意図しているとき、文字列をどのように取得することができますか?なぜこうなった?混乱している。例えば

>>> MyClass({'number': 42, 'date': '28.12.2017'}) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 8, in __init__ 
    File "<string>", line 16, in date 
    File "<string>", line 16, in date 
TypeError: strptime() argument 1 must be str, not datetime.datetime 
+0

*完全なトレースバック*と、あなたの 'MyClass'インスタンスを生成するコードを含めてください。私はこの特定の限定されたケースで*正確に何が起こったのでしょうか*を考え出すことができますが、トレースバックは将来の訪問者が同じ問題を抱えているかどうかをより簡単に見分けることができます。 –

答えて

3

あなたがpropertyオブジェクトとインスタンス属性の両方にdateを使用することはできません。プロパティは(data descriptorであるため)利用可能であり、self.dateはそのプロパティオブジェクトを参照します。 self.date = params['date']という式はparam['date']の値を設定者に渡していますが、インスタンス属性を設定していません。

param['date']はあなたのケースでは明らかにdatetimeオブジェクトなので、これはセッターでdatetime.datetime.strptime(<datetime instance>, '%d.%m.%Y')が呼び出されたときに失敗することを意味します。それが成功したとしても、その結果をself.dateに割り当てようとします。これは、setterを再び無限に呼び出すことになります。あなたは文字列で渡された、と最初.strptime()呼び出しが成功し、今self.datedatetimeインスタンスが作成されたばかりということを割り当てられている、もともとdatetime値で渡さまたはので、それはどちらかdatetimeインスタンスです。

インスタンス属性の名前を変更します。それをリードする、単一のアンダースコアを与えることが、通常はここで最も有用な命名体系です:

class MyClass: 
    _number = None 
    _date = None 

    def __init__(self, params): 
     self._number = params["number"] 
     self._date = params["date"] 

    @property 
    def date(self): 
     return self._date.strftime('%d.%m.%Y') 

    @date.setter 
    def date(self, value): 
     self._date = datetime.datetime.strptime(value, '%d.%m.%Y') 

    def get_vars(self): 
     return vars(self) 

私もself._date上のメソッド呼び出しに(結合していないメソッドの呼び出し)datetime.datetime.strftime(self._date, '%d.%m.%Y')を変更しました。

+0

今それは働き、何がもっと重要である、私は今なぜ理解する)千の感謝 – Dankevich

+0

私はあなたにもう一つ質問をすることができますか?属性を持つdictを返すときにvars()が@propertyを使用していないようです。正しいフォーマットで 'data'値を取得するためにgetterを使う方法はありますか? – Dankevich

+0

@Dankevich:いいえ、 'vars()'はインスタンス属性辞書を返します。クラスのすべての属性( 'dir(ype(self))')を見つけ、それぞれの属性がプロパティかどうかをテストし、インスタンスのプロパティにアクセスしてそれらをリストする必要があります。 –

関連する問題