كيف يمكنني انتزاع عمليات البحث الثعبان: make.up.a.dot.separated.name.and.use.it.until.destroyed = 777
-
05-07-2019 - |
سؤال
وأنا مبتدئ بيثون مع حكة خاصة جدا لهذه التجربة مع عملية دوت اسم-بحث بايثون. كيف يمكنني رمز إما فئة أو وظيفة في "make.py" حتى أن هذه التصريحات مهمة تعمل بنجاح؟
import make
make.a.dot.separated.name = 666
make.something.else.up = 123
make.anything.i.want = 777
المحلول
#!/usr/bin/env python
class Make:
def __getattr__(self, name):
self.__dict__[name] = Make()
return self.__dict__[name]
make = Make()
make.a.dot.separated.name = 666
make.anything.i.want = 777
print make.a.dot.separated.name
print make.anything.i.want
وهذه الطريقة تسمى __getattr__
خاص عندما لم يتم العثور على قيمة اسمه. وmake.anything.i.want
خط ينتهي به ما يعادل:
m1 = make.anything # calls make.__getattr__("anything")
m2 = m1.i # calls m1.__getattr__("i")
m2.want = 777
وتنفيذ أعلاه يستخدم هذه المكالمات إلى __getattr__
لإنشاء سلسلة من Make
الكائنات في كل مرة يتم الوصول إلى خاصية غير معروفة. وهذا يسمح للنقطة يصل إلى أن تتداخل بشكل تعسفي عميق حتى الاحالة النهائية وعند هذه النقطة يتم تعيين قيمة حقيقية.
بيثون الوثائق - تخصيص الوصول السمة :
<اقتباس فقرة> object.__getattr__(self, name)
ودعا عندما يكون البحث السمة لم يجد سمة في الأماكن المعتادة (أي أنها ليست سمة المثال كما أنها ليست موجودة في شجرة فئة self
). name
هو اسم السمة. هذه الطريقة يجب أن تعود (المحسوبة) قيمة السمة أو رفع استثناء AttributeError
.
لاحظ أنه إذا تم العثور على السمة من خلال آلية طبيعية، لا يسمى __getattr__()
. (وهذا هو التماثل المتعمد بين __getattr__()
و__setattr__()
.) ويتم ذلك على حد سواء لأسباب تتعلق بالكفاءة ولأن لولاها __getattr__()
ليس لديهم وسيلة للوصول غيرها من الصفات مثيل. لاحظ أن ما لا يقل عن المتغيرات سبيل المثال، يمكنك السيطرة الكاملة وهمية من خلال عدم إدخال أية قيم في المقام السمة القاموس (ولكن بدلا من ذلك إدراجها في كائن آخر). اطلع على طريقة __getattribute__()
أدناه للحصول على وسيلة لفي الواقع الحصول على السيطرة الكاملة في الطبقات نمط جديد.
object.__setattr__(self, name, value)
ودعا عند محاولة مهمة السمة. وهذا ما يسمى بدلا من آلية طبيعية (أي تخزين القيمة في القاموس سبيل المثال). name
هو اسم السمة، value
هي القيمة التي ستخصص لذلك.
إذا __setattr__()
يريد لتعيين سمة سبيل المثال، فإنه لا ينبغي ببساطة تنفيذ self.name = value
- وهذا من شأنه أن يسبب مكالمة عودي إلى نفسه. بدلا من ذلك، ينبغي أن تضاف قيمة في قاموس المثال الصفات، على سبيل المثال، self.__dict__[name] = value
. في الفصول التي نمط جديد، بدلا من الوصول إلى القاموس سبيل المثال، فإنه يجب استدعاء الأسلوب الفئة الأساسية بنفس الاسم، على سبيل المثال، object.__setattr__(self, name, value)
.