ویدیو آموزش ارثبری از آبجکت های داخلی(built-in) پایتون

February 2022

زمانی که در حال کدنویسی پایتون هستند ممکن است نیاز به ساخت کلاس هایی داشته باشید که همانند آبجکت های داخلی پایتون رفتار میکنند. مثلا نیاز به کلاسی دارید که مثل لیست های پایتون کار میکند. به جای اینکه وقت خود را روی پیاده سازی همچین کلاسی هدر دهید میتوانید از آبجکت های داخلی پایتون ارثبری کنید.

 

به راحتی میتوانید تمام ویژگی های آبجکت های داخلی پایتون را به ارث برده و فقط رفتارهایی که میخواهید را تغییر دهید. اما قبل از اینکار به دو نکته مهم دقت کنید:

  1. برای ارثبری از آبجکت های داخلی پایتون باید کاملا با آن آبجکت آشنا باشید و رفتارهای آن را بشناسید.
  2. حتما برای کدهایتان unittest بنویسید زیرا تغییر رفتار آبجکت های داخلی پایتون میتوانید باعث اشکالات فراوانی شود.

 

در پایتون آبجکت های مختلفی وجود دارد که میتوانید از آنها استفاده کنید. در پایین لیست این آبجکت ها آمده است:

Python Built-in Types:
    Truth Value Testing
    Boolean Operations - and, or, not
    Comparisons
    Numeric Types - int, float, complex
    Iterator Types
    Sequence Types - list, tuple, range
    Text Sequence Type - str
    Binary Sequence Types - bytes, bytearray, memoryview
    Set Types - set, frozenset
    Mapping Types - dict
    Context Manager Types
    Other Built-in Types
    Special Attributes

 

 

 #  ارث بری از آبجکت list

برای درک بهتر این موضوع از یک مثال استفاده میکنیم. قرار است کلاسی بسازیم که دقیقا مثل لیست ها عمل میکند با این تفاوت که فقط توانایی ذخیره رشته را داشته باشد.

 

ابتدا یک کلاس به نام StringList ایجاد کرده و این کلاس از آبجکت داخلی list ارثبری میکند:

class StringList(list):
    pass

 

حالا کلاس ما به تمام ویژگی ها و رفتارهای کلاس list پایتون دسترسی دارد و میتواند همانند لیست های پایتون در خود آیتم ذخیره کند:

a = StringList()

a.append('a')
a.append('b')
print(a)

# OUTPUT
['a', 'b']

 

در این مرحله باید در کلاس StringList متد append را بازنویسی کنیم تا فقط اجازه ذخیره رشته ها را بدهیم و اگر کاربر سعی در ذخیره داده های دیگر مانند عدد کرد با خطا مواجه شود:

class StringList(list):
	def append(self, element):
		if not isinstance(element, str):
			raise TypeError('This list only accepts strings.')
		return super().append(element)

 

حالا اگر کاربر بخواهد عدد را با کلاس ما ذخیره کند با پیغام خطا موجه خواهد شد:

a = StringList()

a.append('a')
a.append(12)
print(a)

# OUTPUT
Traceback (most recent call last):
  File "/home/amir/Desktop/python/two.py", line 16, in <module>
    a.append(12)
  File "/home/amir/Desktop/python/two.py", line 8, in append
    raise TypeError('This list only accepts strings.')
TypeError: This list only accepts strings.

 

ارسال نظر

تلاش میکنم سوالات شما را در کمتر از یک روز پاسخ بدم