لماذا فتيل عدم استخدام فئة الموردة في file_class
سؤال
لدي الثعبان فتيل المشروع بناء على Xmp سبيل المثال في الصمامات الوثائق.ولقد تضمنت قطعة صغيرة من قانون لإظهار كيف يعمل هذا.لسبب get_file لا تحصل يسمى الطبقة يحصل على خلق, ولكن بدلا من الصمامات الدعوة .قراءة() على فئة من get_file (file_class) فتيل تحافظ على الدعوة Dstorage.قراءة() التي الهزائم الغرض في تحريك قراءة وظيفة من تلك الفئة.
class Dstorage(Fuse, Distributor):
def get_file(self, server, path, flags, *mode):
pass
# This does some work and passes back an instance of
# a class very similar to XmpFile
def main(self, *a, **kw):
self.file_class = self.get_file
return Fuse.main(self, *a, **kw)
لدي مدونة مستضافة على انطلاق, يمكنك تحميل البرنامج مع هذا الأمر.
bzr co https://code.launchpad.net/~asa-ايرز/+غير المرغوب فيه/dstorage
bzr فرع lp:~asa-ايرز/dstorage/شنطة
الحل:
أنا استخدم بروكسي فئة فرعية واحدة أنا في حاجة و في منشئ أحصل على سبيل المثال من الصف الأول بحاجة والكتابة كل من وكيل أساليب ببساطة استدعاء أساليب المثال.
المحلول
تبحث في قانون فتيل الطبقة (التي هي متاهة من مقاطع قليلا ملتوي إيجاد طريقة وكلاء) ، أرى هذا الشيء (وهو الإغلاق المستخدمة لإنشاء اضع داخل Fuse.MethodProxy._add_class_type
, خط 865):
def setter(self, xcls):
setattr(self, type + '_class', xcls)
for m in inits:
self.mdic[m] = xcls
for m in proxied:
if hasattr(xcls, m):
self.mdic[m] = self.proxyclass(m)
عندما تفعل self.file_class = self.get_file
, هذا يحصل مع ما يسمى self.get_file
, وهو لا بد الأسلوب.حلقة أكثر من بروكسي سمات يتوقع أن تكون قادرة على الحصول على سمات من الدرجة تعيين, لوضعها في mdic
وكيل القاموس بعد التفاف عليها ، ولكن لم تكن هناك, لأنه لا بد الأسلوب بدلا من فئة.لأنه لا يمكن العثور عليها ، فإنه يعود إلى دعوتهم على Dstorage
.
لذا, قصة قصيرة طويلة, لا يمكنك استخدام للاستدعاء الذي يعود مثيل (نوع من الدرجة الزائفة) بدلا من فئة هنا لأن الصمامات هو introspecting الكائن الذي قمت بتعيين للعثور على أساليب ينبغي أن الدعوة.
تحتاج إلى تعيين فئة إلى file_class
- إذا كنت تحتاج إلى الرجوع إلى الأصل سبيل المثال ، يمكنك استخدام فئة متداخلة خدعة أنها تظهر في مجلد "المستندات".