سؤال

وهذا هو مثال مفتعلة جدا لأنه ليس من السهل شرح السياق الذي ولقد انتهى تنفيذ هذا الحل. ومع ذلك، إذا كان أي شخص يمكن أن يجيب لماذا يحدث هذا خصوصية معينة، وسأكون ممتنا.

والمثال:

class A(dict):  
    def __init__(self):
        self['a'] = 'success'

    def __getitem__(self, name):
        print 'getitem'
        return dict.__getitem__(name)

class B(object):
    def __init__(self):
        self._a = A()
        setattr(self, '__getitem__', self._a.__getitem__) 

b = B()
c = b['a']

وهذه النواتج:

c = b['a']
TypeError: 'B' object is unsubscriptable

وعلى الرغم من انها طريقة غريبة للقيام بذلك (إن شاء subclasses ترث بوضوح سيكون أكثر منطقية)، فلماذا لا تجد الطريقة أكون قد وضعت بشكل واضح؟

إذا أفعل هذا:

dir(b)

وأحصل على هذا:

['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_a']

وتحدث نفس المشكلة مع وسائل أخرى مثل __iter__. ما هو حول تعريف صراحة هذه الطريقة أن يعمل؟

هل كانت مفيدة؟

المحلول

عند استخدام الأقواس <م> [] الثعبان يبدو في الصف. يجب عليك تعيين أسلوب في فئة.

وهنا هو التعليمات البرمجية تكييف:

class A(dict):  
    def __init__(self):
        self['a'] = 'success'

    def __getitem__(self, name):
        print 'getitem!'
        return dict.__getitem__(self, name)

class B(object):
    def __init__(self):
        self._a = A()
        B.__getitem__ = self._a.__getitem__

b = B()
c = b['a']

نصائح أخرى

وهذا هو لأنه لا يمكن تجاوز أساليب الفئة الخاصة على الطاير.

وأنا لم أتمكن من العثور على إشارة عن هذا ولكن هو في الأساس لأنها أساليب الفئة وعدم السماح للطرق المثال.

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