Python @property Dekoratörü

Bu eğitimde Python @property dekoratörü hakkında bilgi edineceksiniz; nesne yönelimli programlamada alıcıları ve ayarlayıcıları kullanmanın Pythonic yolu.

@propertyPython programlama bize Nesne Yönelimli Programlamada alıcı ve ayarlayıcıların kullanımını çok daha kolay hale getiren yerleşik bir dekoratör sağlar.

Dekoratörün ne olduğuna dair ayrıntılara girmeden önce @property, ilk etapta neden gerekli olduğuna dair bir sezgi oluşturalım.


Getters ve Setters olmadan Sınıf

Sıcaklığı Santigrat derece cinsinden saklayan bir sınıf yapmaya karar verdiğimizi varsayalım . Ayrıca sıcaklığı Fahrenheit derecesine dönüştürmek için bir yöntem uygulayacaktır. Bunu yapmanın bir yolu aşağıdaki gibidir:

Bu sınıftan nesneler yapabilir ve temperatureözniteliği istediğimiz gibi değiştirebiliriz:

Çıktı

Fahrenheit’e dönüştürürken fazladan ondalık basamaklar, kayan nokta aritmetik hatasından kaynaklanır. Daha fazla bilgi edinmek için Python Kayan Nokta Aritmetik Hatası sayfasını ziyaret edin .

Yukarıda gösterildiği gibi herhangi bir nesne özniteliği atadığımızda veya aldığımızda temperature, Python onu nesnenin yerleşik __dict__sözlük özniteliğinde arar.

Bu nedenle, man.temperaturedahili olur man.__dict__['temperature'].


Alıcıları ve Ayarlayıcıları Kullanma

Kullanılabilirliğini genişletmek istediğimizi varsayalım.santigratYukarıda tanımlanan sınıf. Hiçbir cismin sıcaklığının -273,15 santigrat derecenin altına ulaşamayacağını biliyoruz (Termodinamikte Mutlak Sıfır)

Bu değer kısıtlamasını uygulamak için kodumuzu güncelleyelim.

Yukarıdaki kısıtlamanın bariz bir çözümü, niteliği gizlemek temperature(özel yapmak) ve onu manipüle etmek için yeni alıcı ve ayarlayıcı yöntemleri tanımlamak olacaktır. Bu şöyle yapılabilir:

Gördüğümüz gibi, yukarıdaki yöntem iki yeni get_temperature()ve yöntemi tanıtıyor set_temperature().

Ayrıca, temperatureile değiştirildi _temperature_Python’da özel değişkenleri belirtmek için başlangıçta bir alt çizgi kullanılır.


Şimdi bu uygulamayı kullanalım:

Çıktı

Bu güncelleme, yeni kısıtlamayı başarıyla uyguladı. Artık sıcaklığı -273,15 santigrat derecenin altına ayarlamamıza izin verilmemektedir.

Not : Özel değişkenler aslında Python’da mevcut değildir. Sadece uyulması gereken normlar vardır. Dilin kendisi herhangi bir kısıtlama uygulamaz.

Ancak, yukarıdaki güncellemeyle ilgili daha büyük sorun, önceki sınıfımızı uygulayan tüm programların kodlarını obj.temperatureto ile obj.get_temperature()ve gibi tüm ifadeleri değiştirmesi obj.temperature = valgerektiğidir obj.set_temperature(val).

Bu yeniden düzenleme, yüz binlerce kod satırıyla uğraşırken sorunlara neden olabilir.

Sonuç olarak, yeni güncellememiz geriye dönük uyumlu değildi. Burası @propertykurtarmaya geldiği yer.


Mülkiyet Sınıfı

Yukarıdaki problemle başa çıkmanın Pythonic bir yolu, propertysınıfı kullanmaktır. Kodumuzu şu şekilde güncelleyebiliriz:

print()İçeriye bir fonksiyon ekledik get_temperature()ve set_temperature()yürütüldüklerini açıkça gözlemlemek için.

Kodun son satırı bir özellik nesnesi yapar temperature. Basitçe söylemek gerekirse, özellik erişim ( ) üye özniteliğine bazı kodlar ( get_temperatureve ) ekler .set_temperaturetemperature

Bu güncelleme kodunu kullanalım:

Çıktı

Gördüğümüz gibi, değerini alan herhangi bir kod, bir sözlük (__dict__) temperaturearaması yerine otomatik olarak arayacaktır . get_temperature()Benzer şekilde, bir değer atayan herhangi bir kod temperatureotomatik olarak set_temperature().

Hatta yukarıda set_temperature()bir nesne oluşturduğumuzda bile çağrıldığını görebiliriz.

Neden olduğunu tahmin edebilir misin?

Bunun nedeni, bir nesne oluşturulduğunda __init__()yöntemin çağrılmasıdır. Bu yöntemin çizgisi vardır self.temperature = temperature. Bu ifade otomatik olarak set_temperature().

c.temperatureBenzer şekilde, otomatik aramalar gibi herhangi bir erişim get_temperature(). Mülkiyetin yaptığı budur. İşte birkaç örnek daha.

kullanarak property, değer kısıtlamasının uygulanmasında herhangi bir değişiklik yapılmasına gerek olmadığını görebiliriz. Bu nedenle, uygulamamız geriye dönük olarak uyumludur.

Not : Gerçek sıcaklık değeri özel _temperaturedeğişkende saklanır. Nitelik temperature, bu özel değişkene bir arayüz sağlayan bir özellik nesnesidir.


@property Dekoratörü

Python’da, bir nesne property()oluşturan ve döndüren yerleşik bir işlevdir . propertyBu işlevin sözdizimi şöyledir:

nerede,

  • fgetözelliğin değerini alma işlevidir
  • fsetözelliğin değerini ayarlama işlevidir
  • fdelözniteliği silme işlevidir
  • docbir dizedir (bir yorum gibi)

Uygulamadan görüldüğü gibi, bu fonksiyon argümanları isteğe bağlıdır. Böylece, bir özellik nesnesi basitçe aşağıdaki gibi oluşturulabilir.

getter()Bir özellik nesnesinin, , setter(), ve deleter()belirtmek için fgetve fsetdaha fdelsonraki bir noktada olmak üzere üç yöntemi vardır . Bu, şu satır anlamına gelir:

şu şekilde parçalanabilir:

Bu iki kod parçası eşdeğerdir.

Python Dekoratörlerine aşina olan programcılar , yukarıdaki yapının dekoratörler olarak uygulanabileceğini fark edebilir.

İsimleri tanımlayamıyoruz get_temperatureve set_temperaturegereksiz oldukları için sınıf isim alanını kirletiyoruz.

temperatureBunun için getter ve setter fonksiyonlarımızı tanımlarken ismi tekrar kullanıyoruz. Bunu bir dekoratör olarak nasıl uygulayacağımıza bakalım:

Çıktı

Yukarıdaki uygulama basit ve verimlidir. Tavsiye edilen kullanım şeklidir property.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.