كيف يمكنني انتزاع عمليات البحث الثعبان: make.up.a.dot.separated.name.and.use.it.until.destroyed = 777

StackOverflow https://stackoverflow.com/questions/1602745

  •  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).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top