Tamam, ilk önce ilk şeyler.
Python'da "değişken bildirimi" veya "değişken başlatma" diye bir şey yoktur.
Basitçe "atama" dediğimiz şey var, ancak muhtemelen "adlandırma" olarak adlandırılmalıdır.
Atama, "sol taraftaki bu ad, daha önce (varsa) ne atıfta bulunduğuna bakılmaksızın artık sağ tarafın değerlendirilmesinin sonucunu ifade etmektedir" anlamına gelir.
foo = 'bar'
foo = 2 * 3
Bu nedenle, Python adlarının (muhtemelen "değişkenlerden" daha iyi bir terim) ilişkili türleri yoktur; değerler yapar. Aynı adı, türüne bakılmaksızın herhangi bir şeye yeniden uygulayabilirsiniz, ancak nesnenin yine de türüne bağlı bir davranışı vardır. İsim, değere (nesneye) başvurmanın bir yoludur. Bu ikinci soruya cevap verir: Sen do not Özel bir türü tutmak için değişkenler oluşturun. Belirli bir türü tutmak için değişkenler oluşturmazsınız. Değişkenler "yaratmıyorsunuz". Nesnelere isim veriyorsunuz.
İkinci nokta: Python, sınıflar söz konusu olduğunda çok basit bir kuralı izler, bu aslında Java, C ++ ve C # gibi dillerin yaptıklarından çok daha tutarlıdır: bloğun içinde bildirilen her şey class
sınıfın bir parçasıdır . Dolayısıyla, def
burada yazılan işlevler ( ) yöntemlerdir, yani sınıf nesnesinin bir parçasıdır (örnek başına depolanmaz), tıpkı Java, C ++ ve C # 'da olduğu gibi; ancak buradaki diğer isimler de sınıfın bir parçasıdır. Yine, isimler sadece isimlerdir ve ilişkili türleri yoktur ve Python'da işlevler de nesnelerdir . Böylece:
class Example:
data = 42
def method(self): pass
Python'da sınıflar da nesnelerdir .
Şimdi , s olan her şeyin sınıfını temsil eden isimli bir nesne yarattık . Bu nesnenin kullanıcı tarafından sağlanan iki özniteliği vardır (C ++ 'da, "üyeler"; C #' da "alanlar veya özellikler veya yöntemler"; Java'da "alanlar veya yöntemler"). Bunlardan biri adlandırılır ve tamsayı değerini saklar . Diğeri adlandırılır ve bir işlev nesnesi depolar. (Python'un otomatik olarak eklediği birkaç özellik daha vardır.)Example
Example
data
42
method
Bu nitelikler yine de nesnenin gerçekten bir parçası değildir. Temelde, bir nesne, artık bölünemeyen şeylere gelene kadar, daha fazla addan (öznitelik adları) oluşan bir demettir. Bu nedenle, kasıtlı olarak ayarladıysanız, değerler bir sınıfın farklı örnekleri arasında veya hatta farklı sınıflardan nesneler arasında paylaşılabilir.
Bir örnek oluşturalım:
x = Example()
Şimdi x
, adında ayrı bir nesnemiz var ve bu nesnenin bir örneği Example
. data
Ve method
nesnenin aslında bir parçası, ama biz yine de aracılığıyla onları bakabilirsiniz x
çünkü Python perde arkasında yaptığı bazı büyü. method
Özellikle yukarı baktığımızda, bunun yerine bir "bağlı yöntem" elde edeceğiz (onu çağırdığımızda x
, self
parametre olarak otomatik olarak geçer , bu, Example.method
doğrudan bakarsak gerçekleşemez ).
Kullanmaya çalıştığımızda ne olur x.data
?
İncelediğimizde, önce nesneye bakılır. Nesnede bulunamazsa, Python sınıfa bakar.
Ancak, atadığımız zaman x.data
, Python nesne üzerinde bir nitelik oluşturacaktır. Bu olacak değil sınıf özelliğini değiştirin.
Bu, nesne başlatma yapmamızı sağlar . Python __init__
, mevcutsa, yeni örnekler oluşturulduklarında sınıfın yöntemini otomatik olarak çağırır . Bu yöntemde, her nesnede o özniteliğin başlangıç değerlerini ayarlamak için öznitelikleri atayabiliriz:
class Example:
name = "Ignored"
def __init__(self, name):
self.name = name
Şimdi, bir name
oluşturduğumuzda a belirtmeliyiz Example
ve her örneğin kendine ait bir örneği vardır name
. Python , bir örneğe Example.name
baktığımızda sınıf özniteliğini yoksayar .name
, çünkü ilk önce örneğin özniteliği bulunur.
Son bir uyarı: değişiklik (mutasyon) ve atama farklı şeylerdir!
Python'da dizeler değişmezdir. Değiştirilemezler. Ne zaman yaparsan:
a = 'hi '
b = a
a += 'mom'
Sen değişmez orijinal 'merhaba' dizesini. Python'da bu imkansızdır. Bunun yerine, yeni bir dize oluşturursunuz 'hi mom'
ve bunun yerine bir isim olmayı a
bırakıp onun yerine 'hi '
bir isim olmaya başlarsınız 'hi mom'
. Biz yapılan b
bir isim 'hi '
de ve yeniden uygulandıktan sonra a
adını, b
hala bir isimdir 'hi '
çünkü 'hi '
hala var ve değiştirilmemiştir.
Ancak listeler değiştirilebilir:
a = [1, 2, 3]
b = a
a += [4]
Şimdi b
[1, 2, 3, 4] de, çünkü b
adı geçen şey için bir isim yaptık a
ve sonra o şeyi değiştirdik. Adlandırılacak yeni bir liste oluşturmadık a
çünkü Python +=
, listeler için farklı davranır .
Bu, nesneler için önemlidir çünkü sınıf özniteliği olarak bir listeniz varsa ve listeyi değiştirmek için bir örnek kullandıysanız, değişiklik diğer tüm örneklerde "görülür". Bunun nedeni, (a) verilerin aslında sınıf nesnesinin bir parçası olması ve herhangi bir örnek nesnesi olmamasıdır; (b) Listeyi değiştirdiğiniz ve basit bir atama yapmadığınız için, sınıf niteliğini gizleyen yeni bir örnek niteliği oluşturmadınız.