وقتی شما برنامه نویسی را شروع می کنید و در عمق آن می روید با یک سری مفاهیم جدید آشنا می شوید که خیلی کاربرد خاصی دارند، یکی از این موارد مفهوم داک تایپینگ یا همان Duck Typing در پایتون می باشد که در ادامه می خواهیم به آن بپردازیم، پس با ما همراه باشید.
اگر میخواهید پایتون را بهتر یاد بگیرید، می توانید از وب سایت آنوفل با ارائه آموزش مقدماتی پایتون و آموزش پیشرفته پایتون استفاده کنید.
Duck typing چیست؟
Duck Typing یک سیستم نوع داده در پایتون می باشد. این سیستم در زبان های پویا(Dynamic Language) مثل PHP و جاوااسکریپت و .. وجود دارد. این سیستم به این گونه می باشد که در آن نوع یا آبجکت یک کلاس نسبت به روشی که تعریف می شود اهمیت کمتری دارد. به صورت دیگری بخواهم بیانش کنم ما زمانی میایم از این مفهوم استفاده می کنیم که نوع اطلاعات ورودی اهمیتی ندارد و فقط می خواهیم که اطلاعات ورودی ما یک ویژگی خاص داشته باشند. و این ویژگی خاص متد یا attribute می باشد.
این Duck Typing از جمله زیر اهام گرفته شده:
“If it looks like a duck and quacks like a duck, it’s a duck”
یعنی اگر شبیه اردک است و شبیه صدای اردک است، اردک است
برای مثال:
# duck typing
class Specialstring:
def __len__(self):
return "Anophel.com"
# Driver's code
if __name__ == "__main__":
string = Specialstring()
print(len(string))
#output => Anophel.com
ما در کد های بالا متد __len__
را تعریف کردیم و آرگومان آن self
می باشد که این self
نمونه یا همان آبجکت ما می باشد. و برای ما یک جمله ای را برگشت می دهد. سپس ما یک متغیر تعریف کردیم و به آن متد Specialstring
دادیم. و سپس به متد __len__
ما Specialstring
را دادیم.
در اینجا نوع آبجکت به خودی خود مهم نیست در این مورد ما آرگومان را در نمونه های اولیه متد اعلام نمی کنیم. این بدان معنی است که کامپایلرها نمی توانند تایپ را چک کنند. بنابراین، آنچه واقعاً اهمیت دارد این است که آیا آبجکت در زمان اجرا دارای ویژگیهای خاصی می باشد.
اگر بخواهم یک مثال دیگر بزنم که با مفاهیم شی گرایی نباشد، بهترین مثال تابع len
می باشد. (دقت کنید تابع len
) به این صورت که اگر شما به این تابع یک لیست یا یک جمله ای بدهید برای شما طولش را حساب می کند و اصلا به وزودی اهمیتی نمی دهد. اما اگر شما به آن عدد بدهید برای شما یک error
می دهد که دلیلش مشخص هست.
len("Anophel.com")
#output => 11
بریم سراغ یک مثال دیگر در شی گرایی :
# duck typing
class Car:
def Propulsion(self):
print("Propulsion with rubber")
class Airplane:
def Propulsion(self):
print("fly with fuel")
class Fish:
def swim(self):
print("fish swim in sea")
# Attributes having same name are
# considered as duck typing
for obj in Car(), Airplane(), Fish():
obj.Propulsion()
# Output =>
# Propulsion with rubber
# fly with fuel
و یک error
خواهیم داشت به شکل زیر:
Traceback (most recent call last):
File "main.py", line 11, in
obj.fly()
AttributeError: 'Fish' object has no attribute 'fly'
در این مثال، میتوانیم ببینیم که یک کلاس از برخی متدها پشتیبانی میکند، و میتوانیم آن را تغییر دهیم یا عملکرد جدیدی به آنها اضافه کنیم. duck typing بر آنچه که آبجکت واقعاً می تواند انجام دهد، تأکید می کند تا اینکه خود آبجکت چیست.