جلسه سی و یکم
شی گرایی
مثال 1: کلاسی برای مدیریت محصولات یک فروشگاه بنویسید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<xmp># محصول class Product: def init(self, name, price, stock): self.name = name self.price = price self.stock = stock def reduce_stock(self, quantity): if quantity > 0 and quantity <= self.stock: self.stock -= quantity print(f"{quantity} {self.name}(s) sold. Remaining stock: {self.stock}") elif quantity > self.stock: print(f"Error: Insufficient stock. Available stock: {self.stock}") else: print("Error: Invalid quantity. Please enter a positive value.") # نمونه ایجاد شده از کلاس sample_product = Product("Laptop", 1200, 50) # تست متد reduce_stock sample_product.reduce_stock(10) sample_product.reduce_stock(60) sample_product.reduce_stock(-5)</xmp> |
مثال 2: کلاسی برای مدیریت یک کتابخانه بنویسید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<xmp># کتابخانه class Library: def __init__(self, name, rules): self.name = name self.books = [] self.members = [] self.rules = rules def add_book(self, book): self.books.append(book) print(f"Book '{book}' added to the library.") def remove_book(self, book): if book in self.books: self.books.remove(book) print(f"Book '{book}' removed from the library.") else: print(f"Error: Book '{book}' not found in the library.") def add_member(self, member): self.members.append(member) print(f"Member '{member}' added to the library.") def lend_book(self, book, member): if book in self.books and member in self.members: self.books.remove(book) print(f"Book '{book}' lent to {member}.") else: print("Error: Book or member not found. Check availability and membership.") def return_book(self, book): self.books.append(book) print(f"Book '{book}' returned to the library.") # نمونه ایجاد شده از کلاس my_library = Library("City Library", "Follow library rules and regulations.") # تست متدها و دسترسی به ویژگیها my_library.add_book("The Great Gatsby") my_library.add_book("To Kill a Mockingbird") my_library.add_member("John Doe") my_library.lend_book("The Great Gatsby", "John Doe") my_library.return_book("The Great Gatsby") my_library.remove_book("To Kill a Mockingbird") my_library.remove_book("Nonexistent Book")</xmp> |
الگوی طراحی سینگلتون (Singleton)
در پایتون یک الگوی بسیار مهم و کاربردی است که ضمانت می کند در طول اجرای برنامه، تنها یک نمونه از یک کلاس خاص وجود داشته باشد
الگوی سینگلتون بسیار مفید است زمانی که نیاز به یک نمونه یگانه از یک کلاس در طول اجرای برنامه باشد، مانند مدیریت منابع مشترک، کنترل کننده های سیستم و غیره. این الگو به شما کمک می کند تا از ایجاد نسخه های اضافی جلوگیری کنید و به این ترتیب منابع سیستم را بهینه سازی کنید.
دکوراتورها (Decorators)
یک ویژگی قدرتمند و انعطاف پذیر هستند که به شما امکان می دهند کد را به طور موقت یا دائمی تغییر دهید. دکوراتورها می توانند به عنوان یک تابع یا یک کلاس تعریف شوند.
بطور خلاصه، دکوراتورها در پایتون به شما امکان می دهند:
1. تابع یا کلاس را قبل از اجرا تغییر دهید.
2. عملکرد جدیدی به تابع یا کلاس اضافه کنید.
3. تابع یا کلاس را بدون تغییر کد اصلی آن، بازنویسی کنید.
یک دکوراتور استاندارد در پایتون با استفاده از @
سمبل قبل از تابع یا کلاس تعریف می شود.
دکوراتورها می توانند پارامترهای ورودی پذیرا باشند، اجازه دهند که تابع یا کلاس اصلی پارامترهای خود را بگیرد، و حتی می توانند تابع را به طور کامل جایگزین کنند.
مثال 3: کلاسی برای اعداد باینری
دکوریتور @staticmethod
در پایتون یک روش بسیار مفید است که به شما اجازه می دهد تا متد هایی را تعریف کنید که به عنوان متد های ایستا (static methods) عمل می کنند.
ویژگی های متد های ایستا در پایتون به شرح زیر است:
1. **عدم نیاز به پرس و جوی برای (self)**: متد های ایستا نیازی به یک شیء مشخص (self) ندارند و می توانند بدون هیچ گونه مرجعی از کلاس فراخوانی شوند.
2. **امکان فراخوانی بدون ایجاد شیء**: متد های ایستا را می توان بدون ایجاد یک شیء از کلاس، مستقیماً از کلاس فراخوانی کرد.
3. **عدم دسترسی به متغیرهای داخلی کلاس**: متد های ایستا نمی توانند به متغیرهای داخلی کلاس دسترسی پیدا کنند، زیرا به شی خاصی مرتبط نیستند.
4. **استفاده برای محاسبات و عملیات کمکی**: متد های ایستا معمولاً برای انجام محاسبات کمکی یا عملیات مستقل از شی استفاده می شوند.
استفاده از متد های ایستا به شما کمک می کند تا کد شما را منظم تر و قابل خواندن تر کنید و همچنین در برخی موارد عملکرد بهتری را ارائه دهید.
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<xmp>class BinaryConverter: @staticmethod def decimal_to_binary(decimal): xx = bin(decimal) yy = xx.replace("0b", "") return yy @staticmethod def binary_to_decimal(binary): return int(binary, 2) # مثال استفاده decimal_number = 10 binary_number = BinaryConverter.decimal_to_binary(decimal_number) print(binary_number) # Output: '1010' decimal_number_again = BinaryConverter.binary_to_decimal(binary_number) print(decimal_number_again) # Output: 10</xmp> |
مثال 4: با استفاده از کلاس فاکتوریل و ساخت شی فاکتوریل عدد را محاسبه کنید
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<xmp>class FactorialCalculator: def __init__(self, number): self.number = number def calculate_factorial(self): result = 1 for i in range(1, self.number + 1): result *= i return result # مثال استفاده number = 5 calculator = FactorialCalculator(number) print(calculator.calculate_factorial()) # Output: 120</xmp> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<xmp>مثال 5: کلاس شمارش رشته های تکراری. class StringDuplicateCounter: def __init__(self, text): self.text = text def count_duplicate_strings(self): words = self.text.split() word_count = {} for word in words: if word in word_count: word_count[word] += 1 else: word_count[word] = 1 duplicate_words = {word: count for word, count in word_count.items() if count > 1} return duplicate_words # مثال استفاده text = "apple orange banana apple orange" counter = StringDuplicateCounter(text) print(counter.count_duplicate_strings()) # Output: {'apple': 2, 'orange': 2}</xmp> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<xmp>مثال 6: کلاس میانه لیست. class MedianCalculator: def __init__(self, numbers): self.numbers = numbers def calculate_median(self): sorted_numbers = sorted(self.numbers) length = len(sorted_numbers) if length % 2 == 0: return (sorted_numbers[length // 2 - 1] + sorted_numbers[length // 2]) / 2 else: return sorted_numbers[length // 2] # مثال استفاده numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] calculator = MedianCalculator(numbers) print(calculator.calculate_median()) # Output: 4.0</xmp> |