ما هي قاعدة لغة Python التي تسمح بوجود واصف أولا؟
سؤال
لقد صدمت في الليلة الماضية الماضية وما زلت في حيرة لتفسيرها:
class Foo(object):
@property
def dave(self):
vars(self)['dave'] = 1
return 2
f = Foo()
print f.dave
print f.dave
تشغيل هذا الرمز ينتج:
2
2
السؤال هو السبب؟ فهمي للوصول السمة هو أنه يتم فحص قاموس المثيل قبل القاموس الطبقي، ومع ذلك القاموس في أي قواعد، ولكن كما هو موضح أعلاه - لا يبدو أن قاموس المثيل قد يتم التحقق قبل العثور على واصف في قاموس الطبقة.
المحلول
فهمي للوصول السمة هو أنه يتم فحص قاموس المثيل قبل القاموس الصفي، والقاموس في أي قواعد
واصفات البيانات هي استثناء:
على سبيل المثال، يرتبط الروابط، فإن الأسبقية من الاحتجاج واصف يعتمد على أساليب واصفها التي يتم تعريفها. عادة، تحدد واصفات البيانات على حد سواء
__get__()
و__set__()
, ، في حين أن واصفات غير البيانات لديها فقط__get__()
طريقة. واصفات البيانات دائما تجاوز إعادة تعريف في قاموس مثيل. في المقابل، يمكن تجاوز واصفات غير البيانات بواسطة مثيلات.http://docs.python.org/Reference/datamodel.html#invoking-descriptors.