آموزش پایتون - متدهای کلاس
متدها متعلق به شئ یک کلاس هستند و برای انجام عملیات خاصی استفاده میشوند. ما میتوانیم متدهای پایتون را به سه دستهبندی مختلف تقسیم کنیم که عبارتاند از: متد کلاس (class method)، متد نمونه (instance method) و متد استاتیک (static method).
یک متد کلاس در پایتون متدی است که به کلاس متصل است و نه به نمونهای از کلاس. این متد را میتوان روی خود کلاس فراخوانی کرد، نه روی نمونهای از کلاس.
بسیاری از ما اغلب متدهای کلاس را با متدهای استاتیک اشتباه میگیریم. همیشه به یاد داشته باشید که اگرچه هر دو روی کلاس فراخوانی میشوند، اما متدهای استاتیک به پارامتر "cls" دسترسی ندارند و بنابراین نمیتوانند وضعیت کلاس را تغییر دهند.
برخلاف متد کلاس، متد نمونه میتواند به متغیرهای نمونه یک شئ دسترسی داشته باشد. همچنین میتواند به متغیر کلاس نیز دسترسی پیدا کند، زیرا بین همه اشیاء مشترک است.
ایجاد متدهای کلاس در پایتون
دو راه برای ایجاد متدهای کلاس در پایتون وجود دارد −
- استفاده از تابع ()classmethod
- استفاده از دکوراتور classmethod@
استفاده از تابع ()classmethod
پایتون دارای یک تابع داخلی به نام ()classmethod است که یک متد نمونه را به یک متد کلاس تبدیل میکند؛ متدی که فقط با ارجاع به کلاس قابل فراخوانی است و نه شئ.
سینتکس
classmethod(instance_method)
مثال
در کلاس Employee، یک متد نمونه به نام ()showcount با آرگومان "self" (ارجاع به شئ فراخوان کننده) تعریف کنید. این متد مقدار empCount را چاپ میکند. سپس، متد را به متد کلاس ()counter تبدیل کنید که از طریق ارجاع کلاس قابل دسترسی باشد.
class Employee:
empCount = 0
def __init__(self, name, age):
self.__name = name
self.__age = age
Employee.empCount += 1
def showcount(self):
print (self.empCount)
counter = classmethod(showcount)
e1 = Employee("Bhavana", 24)
e2 = Employee("Rajesh", 26)
e3 = Employee("John", 27)
e1.showcount()
Employee.counter()
خروجی
فراخوانی ()showcount با شئ و فراخوانی ()count با کلاس، هر دو مقدار تعداد کارمندان را نشان میدهند.
3
3
استفاده از دکوراتور classmethod@
استفاده از دکوراتور ()classmethod@ روش توصیهشده برای تعریف یک متد کلاس است، زیرا نسبت به اینکه ابتدا یک متد نمونه تعریف شود و سپس به متد کلاس تبدیل گردد، بسیار راحتتر است.
سینتکس
@classmethod
def method_name():
# your code
مثال
متد کلاس به عنوان یک سازنده جایگزین عمل میکند. یک متد کلاس به نام ()newemployee با آرگومانهای لازم برای ساخت یک شئ جدید تعریف کنید. این متد شئ ساختهشده را برمیگرداند، کاری شبیه به آنچه متد ()__init__ انجام میدهد.
class Employee:
empCount = 0
def __init__(self, name, age):
self.name = name
self.age = age
Employee.empCount += 1
@classmethod
def showcount(cls):
print (cls.empCount)
@classmethod
def newemployee(cls, name, age):
return cls(name, age)
e1 = Employee("Bhavana", 24)
e2 = Employee("Rajesh", 26)
e3 = Employee("John", 27)
e4 = Employee.newemployee("Anil", 21)
Employee.showcount()
اکنون چهار شئ Employee وجود دارد. اگر برنامه بالا را اجرا کنیم، تعداد اشیاء Employee را نشان خواهد داد −
4
دسترسی به ویژگیهای کلاس در متد کلاس
ویژگیهای کلاس متغیرهایی هستند که به یک کلاس تعلق دارند و مقدار آنها بین تمام نمونههای آن کلاس مشترک است.
برای دسترسی به ویژگیهای کلاس در داخل یک متد کلاس، از پارامتر cls و به دنبال آن نشانه نقطهگذاری (.) و نام ویژگی استفاده کنید.
مثال
در این مثال، ما در حال دسترسی به یک ویژگی کلاس در متد کلاس هستیم.
class Cloth:
# Class attribute
price = 4000
@classmethod
def showPrice(cls):
return cls.price
# Accessing class attribute
print(Cloth.showPrice())
با اجرای کد بالا، خروجی زیر نمایش داده میشود −
4000
افزودن پویا متد کلاس به یک کلاس
تابع ()setattr در پایتون برای مقداردهی پویا به یک ویژگی استفاده میشود. اگر میخواهید یک متد کلاس را به صورت پویا به یک کلاس اضافه کنید، نام متد را به عنوان مقدار پارامتر به تابع ()setattr پاس دهید.
مثال
مثال زیر نحوه اضافه کردن پویا یک متد کلاس به یک کلاس پایتون را نشان میدهد.
class Cloth:
pass
# class method
@classmethod
def brandName(cls):
print("Name of the brand is Raymond")
# adding dynamically
setattr(Cloth, "brand_name", brandName)
newObj = Cloth()
newObj.brand_name()
وقتی کد بالا را اجرا میکنیم، خروجی زیر را نشان میدهد −
Name of the brand is Raymond
حذف پویا متدهای کلاس
عملگر del در پایتون برای حذف پویا متد کلاس استفاده میشود. اگر تلاش کنید به متد حذفشده دسترسی پیدا کنید، کد خطای AttributeError را صادر میکند.
مثال
در مثال زیر، متد کلاس به نام "brandName" را با استفاده از عملگر del حذف میکنیم.
class Cloth:
# class method
@classmethod
def brandName(cls):
print("Name of the brand is Raymond")
# deleting dynamically
del Cloth.brandName
print("Method deleted")
با اجرای کد بالا، خروجی زیر نمایش داده میشود −
Method deleted
پیشرفت مطالعه: وضعیت خواندهشدن این درس فقط در همین مرورگر ذخیره میشود؛ بدون نیاز به حساب کاربری.