مفهوم virtual subclass در پایتون

مفهوم virtual subclass در پایتون

مفهومی که تو این پست درموردش حرف می‌زنیم، اینطوریه که یک کلاس به عنوان فرزند(child) یک کلاس دیگه به حساب میاد، بدون اینکه از کلاس والد(parent) به طور صریح ارث‌بری کرده باشه! چطوری؟ بریم ببینیم.https://thewebtier.com/wp-content/uploads/2019/06/Important-Python-Tips-and-Tricks-for-Programmers.jpg
توی پایتون وقتی می‌خوایم ببنیم که یک کلاس از یک کلاس دیگه ارث‌بری داشته یا نه از متدی به اسم issubclass استفاده می‌کنیم، یعنی به این شکل:class Parent:
pass

class Child(Parent):
pass

print(issubclass(Child, Parent))
# Trueخب تا اینجای کار رفتار طبیعیه و چیز عجیب غریب نداریم.اما ما می‌تونیم به کمک metaclass و بدون ارث‌بری مستقیم همین جواب رو بگیریم! کد زیر نمونه‌ای از این ماجراست:class Base(type):
def __subclasscheck__(cls, subclass):
return True

class Parent(metaclass=Base)
pass

class Child:
pass

print(issubclass(Child, Parent))
# Trueاگر با metaclass آشنا نیستید، می‌تونید از این مطلب کمک بگیرید: https://vrgl.ir/y13PG یک مثال کاربردی‌ترش رو می‌تونید اینجا ببنید.اما این کار به روش دیگه‌ای هم این کار ممکن می‌باشد، و تو این روش از __subclasshook__ استفاده میشه، به این قطعه کد توجه کنید:from abc import ABC

class Parent(ABC):
def do_something(self):
pass

@classmethod
def __subclasshook__(cls, C):
if cls is Parent:
for B in C.__mro__:
if hasattr(B, ‘do_something’)
return True
return NotImplemented
اگر دارین میگین که چه نامگذاری مزخرفی بله میدونم 🙂
البته کد بالا رو میشه این طوری هم نوشت:
if cls is Parent:
if any(&quotdo_something&quot in B.__dict__ for B in C.__mro__):
return True
return NotImplemented

class Child:
def do_something(self):
pass
Parent.register(Child)
print(issubclass(Child, Parent))
# Trueهمین!به یاد عزیزان پروازهای PS752 و IR655و به امید روزهای خوب.منابع:https://docs.python.org/3/library/abc.htmlhttps://realpython.com/python-interface/

Author: admin

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *