Python'un esnek geçersiz kılma mekanizmasıyla sınıflarınızın davranışına ince ayar yapın.
Python'da sınıflar, verileri ve işlevselliği yeniden kullanılabilir öğeler halinde bir araya getirmek için temiz bir yol sağlar. Özel sınıflar oluşturmak, kullanıcılar, ürünler ve çalışanlar gibi gerçek dünyadaki varlıkları modellemenize olanak tanır.
Python sınıfları, sınıflarınızın davranışını benzersiz durumlara göre şekillendirmenize olanak tanıyan, özelleştirebileceğiniz sihirli yöntemleri tanımlar.
Büyü Yöntemlerini Anlamak
Dunder yöntemleri olarak da adlandırılan sihirli yöntemleri, bir nesne üzerinde belirli eylemleri gerçekleştirdiğinizde Python'un otomatik olarak çağırdığı gizli büyüler veya gizli ilahiler olarak düşünün.
Python, sınıflar için birçok yerleşik davranış sağlar. örnek, statik ve sınıf yöntemleri. Yapabilirsiniz Python sınıfları oluşturve sihirli yöntemleri kullanarak bunları daha da özelleştirin.
Sihirli yöntemler Python'da iki alt çizgiye sahip örnek yöntemlerdir (__yöntem__) yöntem adından önce ve sonra.
Bu özel yöntemler Python'a bir sınıfın nesnelerinin nasıl ele alınacağı konusunda talimatlar verir. Python sınıflarında yaygın olarak kullanılan bazı sihirli yöntemler şunlardır:
- __gt__: Bu yöntem bir nesnenin diğerinden büyük olup olmadığını kontrol eder.
- __içinde__: Bu yöntem, bir sınıfın örneğini oluşturduğunuzda çalışır ve esas olarak öznitelik başlatmaya yöneliktir.
- __str__: Bu, nesneyi tanımlayan sınıfın dize temsilini döndürür.
- __repr__: Bu yöntem, nesneyi kullanarak yeniden oluşturmanıza olanak tanıyan bir çıktı verir. değerlendirme().
- __len__: Kullandığınızda uzun() Bir nesne üzerinde işlev gören bu yöntem, nesnenin uzunluğunu döndürür.
- __eq__: Bu yöntem, çift eşittir () kullanan nesneler arasında karşılaştırma yapılmasını sağlar.==) Şebeke.
- __lt__: Nesneler için (
- __eklemek__: Eklemeyi kullandığınızda (+) operatörü nesneler üzerinde bu yöntemi çalıştırır ve ekleme işlemlerini gerçekleştirir.
- __getitem__: Aşağıdaki gibi dizin sözdizimini kullanarak bir nesneden öğeleri almanızı sağlar: nesne[anahtar].
Sihirli Yöntemleri Uygulamak
Büyü yöntemlerini anlamanın en iyi yolu onları kullanmaktır.
Bir Nesnenin Dizi Gösterimi
Okunabilirlik veya daha ileri işlemler için bir nesnenin dize gösterimini özelleştirebilirsiniz.
classPerson:
def__init__(self, name, age):
self.name = name
self.age = age
p1 = Person('John', 25)
print(p1)
Burada basit bir Kişi olan sınıf __içinde__ başlatmak için sihirli yöntem. Yazdırdığınızda p1 nesnesi, Python tarafından sağlanan varsayılan dize gösterimini kullanır.
Dize gösterimini özelleştirmek için __str__ Ve __repr__ sihirli yöntemler:
classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = heightdef__str__(self):
returnf'{self.name} is {self.age} years old'def__repr__(self):
returnf'{self.name} is {self.age} years old'
p1 = Person('John', 25, 78)
print(p1)
Artık daha okunaklı ve kapsamlı bir dize temsiline sahipsiniz. p1 nesne:
Bir Nesnenin Uzunluk Özelliği
Bir düşünün, aradığınızda uzun() Bir Person nesnesinin yöntemini kullanarak onların yüksekliğini istiyorsunuz. Uygulamak __len__ için sihirli yöntem Kişi sınıf:
classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = heightdef__str__(self):
returnf'{self.name} is {self.age} years old'def__repr__(self):
returnf'{self.name} is {self.age} years old'def__len__(self):
return self.height
p2 = Person('Issac', 25, 89)
print(len(p2))
__len__ Magic yöntemi, bir öğenin yükseklik özelliğini döndürür Kişi misal. Aradığın zaman uzun (p2), onu arayacak __len__ otomatik olarak yüksekliğini döndüren sihirli yöntem p2 nesne.
Nesneler Arasındaki Karşılaştırmayı İşleme
Bir sınıfın nesnelerini sınıfın belirli özelliklerine göre karşılaştırmanız gerekiyorsa. Tanımlayabilirsiniz __eq__ sihirli yöntemi kullanın ve karşılaştırma mantığınızı uygulayın.
classPerson:
def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = heightdef__str__(self):
returnf'{self.name} is {self.age} years old'def__repr__(self):
returnf'{self.name} is {self.age} years old'def__len__(self):
return self.heightdef__eq__(self, other):
return self.name == other.name and self.age == other.agep1 = Person('John', 25, 56)
p2 = Person('John', 25, 61)
print(p1 == p2)
__eq__ yöntem karşılaştırır isim Ve yaş ikisinin özellikleri Kişiler eşitliği belirlemek için nesneler.
Çift eşittir (==) operatörü bu yöntemi kimlikleri karşılaştırmak yerine eşitliği kontrol etmek için kullanır. yani iki Kişi Örnekler, eşleşen ad ve yaş özelliklerine sahiplerse eşittir. Bu, özel sınıfınız için varsayılan eşitlik denetimi davranışını geçersiz kılmanıza olanak tanır.
Bu sihirli yöntemleri uygulayarak Python'un yerleşik özellikleriyle tutarlı olacak özel davranışlar tanımlayabilirsiniz.
İleri Büyü Yöntemleri
Sınıfları özelleştirmek için sihirli yöntemleri kullanmanın bazı ileri düzey örneklerini burada bulabilirsiniz.
Sınıfların Kaplar Gibi Hareket Etmesini Sağlama
Sihirli yöntemleri kullanarak kaplar gibi davranan sınıfları tanımlayabilirsiniz. Kullanabilirsiniz tuples gibi kaplar, veri öğeleri koleksiyonlarını depolamak için. İçerdiği öğeleri işlemek, bunlara erişmek ve yinelemek için çeşitli yöntemler sağlarlar.
classPerson:
def__init__(self):
self.data = []def__len__(self):
return len(self.data)def__getitem__(self, index):
return self.data[index]def__setitem__(self, index, value):
self.data[index] = valuedef__delitem__(self, index):
del self.data[index]p1 = Person()
p1.data = [10, 2, 7]
print(len(p1)) # 3
p1[0] = 5
print(p1[0]) # 5
Artık bir Person nesnesi bir konteyner gibi davranabilir:
Öznitelik Erişimini Özelleştirme
Kullanmak __getattr__ sihirli yöntemle, yöntemin niteliklerini özelleştirebilirsiniz. Kişi sınıfa belirli koşullara bağlı olarak erişilmektedir.
classPerson:
def__getattr__(self, name):
if name == 'age':
return40
else:
raise AttributeError(f'No attribute {name}')
p1 = Person()
print(p1.age) # 40
__getattr__ Doğrudan nesnede bulunmayan bir özniteliğe erişmeye çalıştığınızda yöntem çalışacaktır. Bu durumda öznitelik adının olup olmadığını kontrol eder. yaş ve 40 değerini döndürür.
Başka herhangi bir özellik adı için bir değer yükseltir ÖzellikHatası karşılık gelen bir mesajla.
Sınıfların Çağrılabilir Gibi Davranmasını Sağlama
__Arama__ yöntemi, sınıfın bir örneğini çağrılabilir bir nesne (yani bir işlev) olarak değerlendirmenize olanak tanır.
classAdder:
def__call__(self, x, y):
return x + y
adder = Adder()
print(adder(2, 3)) # 5
Bir örneğini oluşturduğunuzda Toplayıcı ve sonra onu argümanlarla çağırın, __Arama__ yöntem sonucu döndürmeden önce çalışır ve toplama işlemini gerçekleştirir.
Operatör Aşırı Yüklemesi
Sihirli yöntemleri kullanarak operatörün aşırı yüklenmesini gerçekleştirebilirsiniz. Operatör aşırı yüklemesi, kendi sınıflarınızın örnekleriyle kullanıldığında yerleşik operatörler için özel davranışlar tanımlamanıza olanak tanır. Operatörün aşırı yüklenmesini açıklayan yaygın bir örneği burada bulabilirsiniz.
classVector:
def__init__(self, x, y):
self.x = x
self.y = ydef__add__(self, other):
if isinstance(other, Vector):
new_x = self.x + other.x
new_y = self.y + other.y
return Vector(new_x, new_y)
else:
raise TypeError("Unsupported operand type for +")def__str__(self):
returnf"({self.x}, {self.y})"# Creating two Vector instances
v1 = Vector(2, 3)
v2 = Vector(1, 4)# Adding two Vector instances using the + operator
v3 = v1 + v2
# Printing the result
print(v3) # Output: (3, 7)
Sonuç yeni bir vektördür:
Vektör sınıf şunu tanımlar: __eklemek__ kullandığınızda çalışan yöntem + Sınıfın iki örneği arasındaki operatör. Yöntem, iki vektörün karşılık gelen bileşenlerini toplar ve yeni bir sonuç döndürür. Vektör sonuç ile örnek.
Burada sınıf davranışınızı özelleştirmek için uygulayabileceğiniz temel sihirli yöntemleri gördünüz. Python'un sınıf oluştururken daha fazla esneklik sunan daha birçok sihirli yöntemi vardır. Bakın resmi belgeler tam bir liste için.
Python'da Nesneye Yönelik Programlama
Python'daki sihirli yöntemler, sınıfların davranışını özelleştirmek ve geliştirmek için güçlü yollar sağlar. Sihirli yöntemler Python'daki nesne yönelimli programlama (OOP) kavramıyla uyumludur. Bu nedenle sihirli yöntemleri kullanmaya çalışırken OOP kavramını anlamak önemlidir.