python - الحصول على وظائف تجاوز فئة فرعية




reflection overriding (3)

فقط لتوضيح المزيد ، عند تحديد أي سمة يتم إضافتها إلى __dict__ سمة Class :

class A:
    def a1(self):
        pass 

print('a1' in A.__dict__) # True Note: vars(A) == A.__dict__  

وللتحقق مما إذا كانت السمة هي طريقة استخدم الساحرة callable built-in بإرجاع True إذا كان الكائن callable (الوظيفة ، الطريقة ، الفئة ، ... إلخ):

 print(callable(A.__dict__['a1']))  # True

والآن ، حتى لو كانت B فئة فرعية من A ولكنها لم تحدد a1 فلن تتم إضافة السمة إلى B.__dict__ :

   class B(A):
      pass

   print('a1' in B.__dict__)  # False 

لذلك من خلال مقارنة القيم من سمات __dict__ التي ستحصل عليها ، يتم تجاوز طريقة witch ، حيث أن witch هي الطريقة الموجودة في A.__dict__ و B.__dict__

  override_method = [attr for attr in B.__dict__ if attr in A.__dict__ and callable(A.__dict__[attr])]

ملاحظة: يمكنني استبدال A.__dict__ بـ A.__dict__ vars(A) لتبسيط الكود لكنني أردت عرض هذه السمة الخاصة التي تمت إضافتها بواسطة python لمطور Python الجديد.

هل هناك طريقة للحصول على جميع وظائف تجاوز فئة فرعية في بيثون؟

مثال:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


class B(A):
    def a2(self):
        pass

    def b1(self):
        pass

هنا ، أود الحصول على قائمة ["a2"] لكائن من الفئة B (أو لكائن الفئة نفسه) لأن الفئة B تتخطى طريقة واحدة فقط ، وهي a2 .


يمكنك الاستفادة من __mro__ tuple ، الذي يحتفظ بترتيب دقة الطريقة.

على سبيل المثال الخاص بك:

>>> B.__mro__
( <class '__main__.B'>, <class '__main__.A'>, <class 'object'>) 

حتى تتمكن من الالتفاف على تلك المجموعة والتحقق مما إذا كانت طريقة B موجودة أيضًا في أحد الفئات الأخرى.


class A:

    def a1(self):
        pass

    def a2(self):
        pass


class B(A):

    def a2(self):
        super().a2()  
        pass

    def b1(self):
        pass
obj = B()

obj.a2()   # ***first give the output of parent class then child class***




subclass