Tüm iyi örneklerde olduğu gibi, aslında yapmaya çalıştığınız şeyi basitleştirdiniz. Bu iyidir, ancak sınıf ve örnek değişkenleri söz konusu olduğunda python'un çok fazla esnekliğe sahip olduğunu belirtmek gerekir . Aynı şey yöntemler için de söylenebilir. Olasılıkların iyi bir listesi için, Michael Fötsch'in yeni stil sınıfları tanıtımını , özellikle 2'den 6'ya kadar olan bölümleri okumanızı tavsiye ederim .
Başlarken hatırlanması gereken çok şey gerektiren bir şey, python'un java olmamasıdır. Bir klişeden daha fazlası. Java'da, tüm sınıf derlenir ve ad alanı çözünürlüğünü basitleştirir: bir yöntemin dışında (herhangi bir yerde) bildirilen değişkenler örnek (veya statik ise sınıf) değişkenleridir ve yöntemler içinde dolaylı olarak erişilebilir.
Python ile, genel kural, değişkenler için sırayla aranan üç ad alanının olmasıdır:
- İşlev / yöntem
- Mevcut modül
- yerleşikleri
{begin pedagogy}
Bunun sınırlı istisnaları vardır. Benim için esas olan, bir sınıf tanımı yüklenirken, sınıf tanımının kendi örtük ad alanı olmasıdır. Ancak bu sadece modül yüklendiği sürece devam eder ve bir yöntem içindeyken tamamen atlanır. Böylece:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
fakat:
>>> class B(object):
foo = 'foo'
def get_foo():
return foo
bar = get_foo()
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
class B(object):
File "<pyshell#11>", line 5, in B
bar = get_foo()
File "<pyshell#11>", line 4, in get_foo
return foo
NameError: global name 'foo' is not defined
{end pedagogy}
Sonunda, hatırlamak şey olduğunu do muhtemelen örtülü erişmek istediğiniz değişkenlerin herhangi erişebilir, ama. Hedefleriniz basit ve anlaşılırsa, Foo.bar veya self.bar'a gitmek muhtemelen yeterli olacaktır. Örneğiniz daha karmaşık hale geliyorsa veya kalıtım gibi süslü şeyler yapmak istiyorsanız (statik / sınıf yöntemlerini miras alabilirsiniz!) Veya sınıfın kendisinin sınıf içindeki ismine gönderme fikri sizin için yanlış görünüyor, kontrol edin bağlandığım giriş.