Zephyrnet Logosu

Zarif Kod Yazmak için 8 Yerleşik Python Dekoratörü – KDnuggets

Tarih:

Zarif Kod Yazmak için 8 Yerleşik Python Dekoratörü
Editöre göre resim
 

Python, temiz ve okunabilir söz dizimi ile yaygın olarak kullanılan üst düzey bir programlama dilidir. Python, basitliği ve program bakımının azaltılmış maliyetini vurgulayan kullanım kolaylığı için tasarlanmıştır. Geliştiricilerin sıfırdan kod yazma ihtiyacını azaltan ve geliştiricilerin üretkenliğini artıran kapsamlı bir kitaplıkla birlikte gelir. Python'un kod zarafetine katkıda bulunan güçlü özelliklerinden biri de dekoratörlerdir.

Python'da dekoratör, başka bir fonksiyonun davranışını, onun temel mantığını değiştirmeden değiştirmenize izin veren bir fonksiyondur. Başka bir işlevi argüman olarak alır ve işlevi genişletilmiş işlevselliğe sahip olarak döndürür. Bu şekilde, yalnızca birkaç satır kodla yeniden kullanılabilirliği artırmak amacıyla mevcut işlevlere ekstra mantık eklemek için dekoratörleri kullanabilirsiniz. Bu makalede, daha zarif ve bakımı kolay kod yazmanıza yardımcı olabilecek sekiz yerleşik Python dekoratörünü inceleyeceğiz.

 

Zarif Kod Yazmak için 8 Yerleşik Python Dekoratörü
Editöre göre resim

The @atexit.register Dekoratör, programın sonlandırılmasında yürütülecek bir işlevi kaydetmek için kullanılır. Bu işlev, normal yürütme veya beklenmeyen bir hata nedeniyle programdan çıkmak üzereyken herhangi bir görevi gerçekleştirmek için kullanılabilir.

Örnek:

import atexit

# Register the exit_handler function
@atexit.register
def exit_handler():
    print("Exiting the program. Cleanup tasks can be performed here.")

# Rest of the program
def main():
    print("Inside the main function.")
    # Your program logic goes here.

if __name__ == "__main__":
    main()

Çıktı:

Inside the main function.
Exiting the program. Cleanup tasks can be performed here.

 

Yukarıdaki uygulamada, @atexit.register Fonksiyon tanımının üstünde bahsedilmiştir. Şunu tanımlar: exit_handler() çıkış işlevi olarak işlev görür. Temel olarak bu, program normal yürütme yoluyla veya erken çıkışa neden olan beklenmeyen bir hata nedeniyle sonlanma noktasına ulaştığında, exit_handler() fonksiyon çağrılacaktır.

The @dataclasses.dataclass “__init__”, “__repr__” ve diğerleri gibi sınıflar için otomatik olarak ortak özel yöntemler oluşturmak için kullanılan güçlü bir dekoratördür. Sınıfınızın örneklerini başlatmak ve karşılaştırmak için standart yöntemler yazma ihtiyacını ortadan kaldırarak daha temiz, daha kısa kod yazmanıza yardımcı olur. Ayrıca ortak özel yöntemlerin kod tabanınızda tutarlı bir şekilde uygulanmasını sağlayarak hataların önlenmesine yardımcı olabilir.

Örnek:

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int


point = Point(x=3, y=2)
# Printing object
print(point)

# Checking for the equality of two objects
point1 = Point(x=1, y=2)
point2 = Point(x=1, y=2)
print(point1 == point2)

Çıktı:

Point(x=3, y=2)
True

 

The @dataclass Point sınıfı tanımının üzerine uygulanan dekoratör, Python'a özel yöntemler oluşturmak için varsayılan davranışı kullanması için sinyal verir. Bu otomatik olarak aşağıdakileri oluşturur: __init__ Nesne örneklemesi üzerine x ve y gibi sınıf niteliklerini başlatan yöntem. Sonuç olarak nokta gibi örnekler açık kodlamaya gerek kalmadan oluşturulabilir. Üstelik, __repr__ Nesnelerin dize gösterimini sağlamaktan sorumlu olan yöntem de otomatik olarak ayarlanır. Bu, nokta gibi bir nesne yazdırıldığında, çıktıda görüldüğü gibi net ve düzenli bir temsil elde edilmesini sağlar: Nokta(x=3, y=2). Ek olarak, iki örnek (nokta1 ve nokta2) arasındaki eşitlik karşılaştırması (==) True değerini üretir. Bu dikkat çekicidir çünkü Python varsayılan olarak bellek konumuna göre eşitliği kontrol eder. Ancak veri sınıfı nesneleri bağlamında eşitlik, bunların içerdiği veriler tarafından belirlenir. Bunun nedeni @dataclass dekoratörünün bir __eq__ Aynı bellek konumunu kontrol etmek yerine, nesnelerde bulunan verilerin eşitliğini kontrol eden yöntem.

The @enum.unique enum modülünde bulunan dekoratör, bir numaralandırmanın tüm üyelerinin değerlerinin benzersiz olmasını sağlamak için kullanılır. Bu, aynı değere sahip birden fazla numaralandırma üyesinin yanlışlıkla oluşturulmasını önlemeye yardımcı olur ve bu da karışıklığa ve hatalara yol açabilir. Yinelenen değerler bulunursa, Değer Hatası yükseltildi.

Örnek:

from enum import Enum, unique

@unique
class VehicleType(Enum):
    CAR = 1
    TRUCK = 2
    MOTORCYCLE = 3
    BUS = 4

# Attempting to create an enumeration with a duplicate value will raise a ValueError
try:
    @unique
    class DuplicateVehicleType(Enum):
        CAR = 1
        TRUCK = 2
        MOTORCYCLE = 3
        # BUS and MOTORCYCLE have duplicate values
        BUS = 3
except ValueError as e:
    print(f"Error: {e}")

 

Çıktı:

Error: duplicate values found in : BUS -> MOTORCYCLE

 

Yukarıdaki uygulamada “BUS” ve “MOTORCYCLE” aynı “3” değerine sahiptir. Sonuç olarak, @unique dekoratör, yinelenen değerlerin bulunduğunu belirten bir mesajla birlikte bir ValueError oluşturur. Aynı anahtarı birden fazla kullanamayacağınız gibi, aynı değeri farklı üyelere de atayamazsınız. Bu şekilde, birden fazla numaralandırma üyesi için yinelenen değerlerin önlenmesine yardımcı olur.

The partial dekoratör kısmi işlevler oluşturmak için kullanılan güçlü bir araçtır. Kısmi işlevler, orijinal işlevin bazı bağımsız değişkenlerini önceden ayarlamanıza ve bu bağımsız değişkenler önceden doldurulmuş olarak yeni bir işlev oluşturmanıza olanak tanır.

Örnek:

from functools import partial

# Original function
def power(base, exponent):
    return base ** exponent

# Creating a partial function with the exponent fixed to 2
square = partial(power, exponent=2)

# Using the partial function
result = square(3)
print("Output:",result)

 

Çıktı:

 

Yukarıdaki uygulamada, "taban" ve "üs" olmak üzere iki argümanı kabul eden ve üssün üssüne yükseltilmiş tabanın sonucunu döndüren bir "güç" fonksiyonumuz var. Üssün önceden 2'ye ayarlandığı orijinal fonksiyonu kullanarak "kare" adında kısmi bir fonksiyon oluşturduk. Bu şekilde, orijinal fonksiyonların işlevselliğini bir partial dekoratör.

The @singledisptach Dekoratör genel işlevler oluşturmak için kullanılır. Aynı ada sahip ancak farklı argüman türlerine sahip işlevlerin farklı uygulamalarını tanımlamanıza olanak tanır. Kodunuzun farklı veri türleri için farklı davranmasını istediğinizde özellikle kullanışlıdır.

Örnek:

from functools import singledispatch

# Decorator
@singledispatch
def display_info(arg):
    print(f"Generic: {arg}")

# Registering specialized implementations for different types
@display_info.register(int)
def display_int(arg):
    print(f"Received an integer: {arg}")

@display_info.register(float)
def display_float(arg):
    print(f"Received a float: {arg}")

@display_info.register(str)
def display_str(arg):
    print(f"Received a string: {arg}")

@display_info.register(list)
def display_sequence(arg):
    print(f"Received a sequence: {arg}")

# Using the generic function with different types
display_info(39)             
display_info(3.19)          
display_info("Hello World!")
display_info([2, 4, 6])     

 

Çıktı:

Received an integer: 39
Received a float: 3.19
Received a string: Hello World!
Received a sequence: [2, 4, 6]

 

Yukarıdaki uygulamada ilk olarak genel işlevi geliştirdik. display_info() ile @singledisptach dekoratörünü oluşturdum ve daha sonra int, float, string ve list için uygulamasını ayrı ayrı kaydettim. Çıktı çalışmasını gösterir display_info() ayrı veri türleri için.

The @classmethod sınıf içindeki sınıf yöntemlerini tanımlamak için kullanılan bir dekoratördür. Sınıf yöntemleri sınıfın nesnesinden ziyade sınıfa bağlıdır. Statik yöntemler ile sınıf yöntemleri arasındaki temel ayrım, bunların sınıf durumuyla etkileşiminde yatmaktadır. Sınıf yöntemlerinin sınıf durumuna erişimi vardır ve bunları değiştirebilir, oysa statik yöntemler sınıf durumuna erişemez ve bağımsız olarak çalışamaz.

Örnek:

class Student:
    total_students = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Student.total_students += 1

    @classmethod
    def increment_total_students(cls):
        cls.total_students += 1
        print(f"Class method called. Total students now: {cls.total_students}")

# Creating instances of the class
student1 = Student(name="Tom", age=20)
student2 = Student(name="Cruise", age=22)

# Calling the class method
Student.increment_total_students()  #Total students now: 3

# Accessing the class variable
print(f"Total students from student 1: {student1.total_students}")
print(f"Total students from student 2: {student2.total_students}")

 

Çıktı:

Class method called. Total students now: 3
Total students from student 1: 3
Total students from student 2: 3

 

Yukarıdaki uygulamada, Öğrenci sınıf var toplam_öğrenciler sınıf değişkeni olarak @classmethod Dekoratör tanımlamak için kullanılır. increment_total_students() artırmak için sınıf yöntemi toplam_öğrenciler değişken. Öğrenci sınıfının bir örneğini oluşturduğumuzda, toplam öğrenci sayısı bir artırılır. Sınıfın iki örneğini oluşturduk ve ardından sınıf yöntemini kullanarak bunları değiştirdik. toplam_öğrenciler değişken 3Bu aynı zamanda sınıfın örnekleri tarafından da yansıtılır.

The @staticmethod Dekoratör, bir sınıf içindeki statik yöntemleri tanımlamak için kullanılır. Statik yöntemler, sınıfın örneğini oluşturmadan çağrılabilen yöntemlerdir. Statik yöntemler genellikle nesneyle ilgili parametrelere erişmeleri gerekmediğinde ve bir bütün olarak sınıfla daha fazla ilişkili olduğunda kullanılır.

Örnek:

class MathOperations:
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def subtract(x, y):
        return x - y

# Using the static methods without creating an instance of the class
sum_result = MathOperations.add(5, 4)
difference_result = MathOperations.subtract(8, 3)

print("Sum:", sum_result)            
print("Difference:", difference_result)

 

Çıktı:

Sum: 9
Difference: 5

 

Yukarıdaki uygulamada kullandığımız @staticmethod “MathOperations” sınıfı için statik bir yöntem add() tanımlamak için. Sınıfın herhangi bir örneğini oluşturmadan “4” ve “5” sayılarını toplayarak “9” sonucunu elde ettik. Benzer şekilde, “8” elde etmek için “3” ve “5” sayılarını çıkarın. Bu şekilde, bir örneğin durumunu gerektirmeyen yardımcı program işlevlerini gerçekleştirmek için statik yöntemler oluşturulabilir. 

The @property Dekoratör, sınıf niteliği için alıcı yöntemlerini tanımlamak için kullanılır. Alıcı yöntemleri, bir özelliğin değerini döndüren yöntemlerdir. Bu yöntemler, sınıfın veya örneğin ayrıntılarına kimin erişebileceğini belirten veri kapsülleme için kullanılır.

Örnek:

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        # Getter method for the radius.
        return self._radius

    @property
    def area(self):
        # Getter method for the area.
        return 3.14 * self._radius**2

# Creating an instance of the Circle class
my_circle = Circle(radius=5)

# Accessing properties using the @property decorator
print("Radius:", my_circle.radius)          
print("Area:", my_circle.area)  

 

Çıktı:

Radius: 5
Area: 78.5

 

Yukarıdaki uygulamada, "Çember" sınıfının "yarıçap" özelliği vardır. Kullandık @property hem yarıçap hem de alan için alıcı yöntemlerini ayarlamak. Sınıfın kullanıcılarının bu niteliklere erişmesi için temiz ve tutarlı bir arayüz sağlar. 

Bu makalede, kodunuzu daha esnek ve okunabilir hale getirmek için kullanabileceğiniz en çok yönlü ve işlevsel dekoratörlerden bazıları vurgulanmaktadır. Bu dekoratörler, orijinal işlevin işlevlerini genişleterek onu daha düzenli ve hatalara daha az eğilimli hale getirmenize olanak tanır. Python programlarınızın düzenli görünmesini ve sorunsuz çalışmasını sağlayan sihirli dokunuşlar gibidirler.
 
 

Kanval Mehreen veri bilimine ve yapay zekanın tıptaki uygulamalarına büyük ilgi duyan, gelecek vadeden bir yazılım geliştiricisidir. Kanwal, APAC bölgesi için Google Generation Scholar 2022 olarak seçildi. Kanwal, trend olan konularda makaleler yazarak teknik bilgilerini paylaşmayı seviyor ve teknoloji endüstrisinde kadınların temsilini geliştirme konusunda tutkulu.

spot_img

En Son İstihbarat

spot_img