Öznitelik, nokta sözdizimini kullanarak başka bir nesneye bakan bir değişkendir: obj.attribute
. Python'un tasarlanma şekli, öznitelik aramaları çeşitli şeyler yapabilir ve bu ne olup bittiğini gerçekten anlayamazsanız, bu çeşitlilik bazen hatalara yol açabilir (bu, bağlandığınız belgelerle ilgili olarak uyarır).
En temel sorun, bir öznitelik aramasının, nesnenin örnek sözlüğünde saklanan bir değeri bulabilmesi veya nesnenin sınıfından (veya miras kalıyorsa bir temel sınıf) bir şey bulabilmesidir. Yöntemler sınıfta saklanan işlevlerdir, ancak genellikle bunları bir örneğe bakarak (yöntemi "bağlayan", yöntemi çağrıldığında nesnenin ilk argüman olarak eklenmesiyle) kullanırsınız.
Ne zaman karmaşık bir şekilde kontrol edildiğinin tam sırası (tüm işlemi an answer to another question'da tanımladım), ancak en temel düzeyde örnek öznitelikleri genellikle sınıf özniteliğine göre önceliklidir.
Örnek adı ve aynı ada sahip bir sınıf özniteliği her ikisi de varsa, genellikle yalnızca örnek özniteliği erişilebilir olacaktır. İstenmeyen ise bu çok kafa karıştırıcı olabilir.
Aşağıdaki kodu düşünün:
class Foo(object):
def __init__(self, lst):
self.lst = lst
def sum(self):
self.sum = sum(self.lst)
return self.sum
f = Foo([1,2,3])
print(f.sum())
print(f.sum())
Bu kodun altına, iki özdeş aramalar yapmak. İlk iş gayet iyi, ama ikincisi bir istisna artacaktır.
f.sum
ilk kez baktığımızda, Foo
sınıfında bir yöntem buluyoruz. Yöntemi hiçbir sorun olmadan arayabiliriz. Sorun, sum
yönteminin sum
yönteminin hesaplamasını (self.lst
öğesinin toplamı) sum
olarak adlandırılan örnek özniteliğine atamalarından kaynaklanmaktadır. Bu, sum
yöntemini görünümden gizler.
İkinci f.sum()
numaralı çağrı, f.sum
numaralı telefona baktığında, beklenen yöntem yerine tamsayı 6
'u içeren örnek özniteliğini bulur. Bir tamsayı callable değil, bu yüzden bir istisna alırız.
Çözüm, elbette, yöntem ve öznitelik için aynı adı kullanmamaktır. Yukarıdaki kod oldukça önemsiz bir örnektir. Bu tür bir şeyin daha karmaşık koddaki nedenlerden kaynaklanabilecek hatalar daha da zor olabilir.
Çok fazla bilmediğiniz nesnelere nitelik katan kod yazıyorsanız, genel adlardan kaçınmaya dikkat etmelisiniz. Bir mixin sınıfı yazıyorsanız, tam olarak bu tür bir durum için tasarlanan Python'un ad manganlamasını tetiklemek için özellik adlarında iki önde gelen alt çizgi kullanmayı düşünün.
Açıklamanız oldukça basittir. Bu yüzden bana bağlandığım belgelerin 'data attribute' = 'instance attribute', 'method attribute' = 'class attribute' anlamına gelmesini istediğini görüyorum. Eğer yanılıyorsam lütfen beni düzeltin. –
Evet, doğru. Belgelerin oldukça eski ve tamamen güncel olmayabilir düşünüyorum. Şüphesiz, "örnek özniteliği" ve "sınıf özniteliği" bu günlerde çok daha yaygın terimlerdir. Ayrıca, gerçek durumun burada sunduğumdan biraz daha karmaşık olduğunu da belirtmek gerekir. Bazı sınıf öznitelikleri (ör. 'Property' nesneleri) örnek özniteliklerine göre öncelikli olacaktır. Bununla birlikte, bu durumda, sonuç olarak, son derece muhtemeldir. – Blckknght