Veri öznitelikleri aynı isimli yöntem özniteliklerini bastırırlar. Büyük
programlardaki zor fark edilen isim çakışması hatalarından kaçınmak
için çakışmaları en aza indirecek bir isimlendirme yöntemi kullanmak
akıllıca olur. Yöntem isimlerini büyük harf ile başlatılırken, veri
isimleri özel bir karakter (alt çizgi gibi) ile başlatılabilir.
Yöntemler için fiil ve veri yapıları için isim olan kelimeler
kullanılabilir.
Veri özniteliklerine o nesnenin kullanıcıları (“istemcileri”)
başvuru yapabileceği gibi, yöntemler de bunlara başvuruda bulunabilirler.
Başka bir deyişle, sınıflar tamamen soyut veri türleri oluşturmak için
kullanılamazlar. Aslında, Python'da hiçbir şey veri saklamayı zorlamayı
mümkün kılmaz.
Kullanıcılar nesnelerin veri özniteliklerini dikkatli kullanmalılar; çünkü
istemciler yöntemler tarafından kullanılan önemli değişkenlere atama yaparak
istenmeyen hatalara sebep olabilirler. İstemcilerin, isim çakışmalarından
kaçındıkları sürece, bir nesneye yöntemlerinin geçerliliğini etkilemeden
kendi veri özniteliklerini ekleyebileceklerine dikkat edin.
Yöntem içinden veri özniteliklerine (ya da diğer yöntemlere!) başvuruda
bulunmanın kestirme bir yolu yoktur. Bunun aslında yöntemlerin
okunabilirliğini artırdığını düşünüyorum; bir yönteme göz attığınızda
yerel değişkenler ile nesne değişkenlerini birbirilerine karıştırma şansı
yoktur.
Usul olarak yöntemlerin ilk argümanına self
adı verilir. Bu tamamen usule dayanır; self isminin
Python için kesinlikle hiç bir özel anlamı yoktur. Bu usule uymazsanız
programınız diğer Python programcıları tarafından daha zor okunur ve
sınıf tarayıcısı (class browser) programları da bu usule dayanıyor
olabilirler.
Sınıf özniteliği olan her işlev, o sınıfın nesneleri için bir
yöntem tanımlar. İşlev tanımının sınıf tanımı içerisinde olması şart
değildir; işlevi, sınıf içindeki yerel bir değişkene atamak da mümkündür.
Örneğin:
# Sınıf dışında tanımlanmış işlev
def f1(self, x, y):
return min(x, x+y)
class C:
f = f1
def g(self):
return 'Merhaba'
h = g
Şimdi f, g ve h'ın
hepsi C sınıfının özellikleri oldular ve aynı anda
C sınıfının nesnelerinin de
yöntemleridirler (g ve h birbirinin
tamamen aynısıdır). Bu tür uygulamanın genellikle sadece okuyucunun
kafasını karıştırmaya yaradığına dikkat edin. Yöntemler self
argümanının yöntem olan özelliğini kullanarak diğer yöntemleri
çağırabilirler:
class Bag:
def __init__(self):
self.data = []
def add(self, x):
self.data.append(x)
def addtwice(self, x):
self.add(x)
self.add(x)
Yöntemler sıradan işlevlerin yaptığı şekilde global değişkenlere
başvuru yapabilirler. Bir yönteme ilişkin global etki alanı sınıf
tanımının bulunduğu modüldür. Sınıfın kendisi asla global etki alanı
olarak kullanılmaz. Bir yöntem içinde global veri kullanmak için ender
olarak iyi bir sebep olduğu halde, global etki alanı kullanımın pek çok
mantıklı sebebi vardır. Örneğin, global etki alanına yüklenmiş işlev ve
modülleri, yöntemler ve bunun içinde tanımlanmış diğer işlev ve sınıflar
kullanılabilir. Genellikle yöntemi içeren sınıfın kendisi bu global etki
alanı içinde tanımlanmıştır ve bir sonraki kısımda bir yöntemin kendi
sınıfına başvurmak istemesi için birkaç iyi sebep bulacağız!