python - creating managed attributes
天蓬老师
天蓬老师 2017-04-17 14:20:41
0
2
781

Cookbook 8.6节有个例子:
http://chimera.labs.oreilly.com/books/1230000000393/ch08.html#_problem_124

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

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

    # Setter function
    @first_name.setter
    def first_name(self, value):
        if not isinstance(value, str):
            raise TypeError('Expected a string')
        self._first_name = value

    # Deleter function (optional)
    @first_name.deleter
    def first_name(self):
        raise AttributeError("Can't delete attribute")

有个问题是,为什么__init__里面的是self.first_name而不是self._first_name,他说是

In this example, the entire point of the property is to apply type checking when setting an attribute. Thus, chances are you would also want such checking to take place during initialization. By setting self.first_name, the set operation uses the setter method (as opposed to bypassing it by accessing self._first_name).

我看不明白,求解释一下,多谢

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(2)
阿神

__init__ で初期化して、first_name
に値を割り当てます ここで使用されている self.first_name は、
@first_name.setter def first_name(self, value):

であるためです。

self._first_nameを直接使用する場合、
@first_name.setter def first_name(self, value):

は入力されません

はありません
if not isinstance(value, str): raise TypeError('Expected a string')
型チェック。

いいねを押す +0
Peter_Zhu

ゲッターを介してプライベート変数にアクセスする Java と同様に、変数への直接アクセスを回避し、より標準化されています

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート