آموزش کلاس های abstract در پایتون

September 2019

کلاس های انتزاعی در پایتون به کلاس هایی گفته میشوند که پایه کلاس های دیگر هستند. کلاس های انتزاعی به خودی خود کار خاصی انجام نمیدهند فقط رفتار کلی کلاس های فرزند را مشخص میکنند

در مثال زیر ما دوتا کلاس داریم به اسم A و ‌‌B که کلاس B داره از کلاس A ارث بری میکنه.
 

class A:
	def show(self):
		pass

class B(A):
	pass

در کلاس A یک متد به نام show وجود داره. در کد بالا کلاس B میتونه متد show رو نادیده بگیره و بازنویسیش نکنه.
اما اگه بخواید حالتی رو بوجود بیارید که کلاس B مجبور به بازنویسی متد show شود میتونید از AbstractClass استفاده کنید.

from abc import ABC

class A(ABC):
	def show(self):
		pass

class B(A):
	pass

b1 = B()

در کد بالا کلاس A رو به یک کلاس انتزاعی تبدیل کردیم. همینطور که میبینید برای این کار از ماژول abc کلاس ABC رو وارد کردیم. کلاس ABC به شما اجازه میده کلاس هاتون رو انتزاعی کنید تا بقیه کلاس ها فرزند مجبور به بازنویسی متدهاش بشن. در کد بالا کلاس B متد show رو بازنویسی نکرده و انتظار داریم که پایتون بهمون ارور بده. اما اگه کد بالا رو اجرا کنید میبینید که اتفاقی نمیفته. چرا؟ چون پایتون اعتقادی به زور کردن یک موضوع نداره. اون کلاس ABC که کلاس A داره ازش ارث بری میکنه بیشتر یک حالت نمایشی داره تا برنامه نویس بفهمه که داره از یک کلاس انتزاعی ارثبری میکنه. اما اگه احیانا دلتون بخواد واقعا برنامه نویس رو مجبور به بازنویسی کنید میتونید متدهاتون رو هم به شکل انتزاعی دربیارید:

from abc import ABC, abstractmethod

class A(ABC):
	@abstractmethod
	def show(self):
		pass

class B(A):
	pass

b1 = B()

از داخل ماژول abc ما دکوراتور absractmethod رو وارد کردیم و به متدمون دادیم. حالا دیگه کلاس  B مجبور به بازنویسی متد show خواهد بود. کد بالا رو که اجرا کنید به شکل زیر به شما ارور میده:

TypeError: Cant instantiate abstract class B with abstract methods show

حالا دیگه مجبورید متد show رو بازنویسی کنید. به شکل زیر:

from abc import ABC, abstractmethod

class A(ABC):
	@abstractmethod
	def show(self):
		pass

class B(A):
	def show(self):
		print('Show method...')

b1 = B()
b1.show()

برای اطلاعات بیشتر ویدیو رو تماشا کنید

ارسال نظر

اگر قراره سوالی بپرسید که داخلش کد هست، بهتره از کدتون عکس بگیرید و به ایمیلی که پایین نوشتم بفرستید