Seperti halnya semua contoh bagus, Anda telah menyederhanakan apa yang sebenarnya Anda coba lakukan. Ini bagus, tetapi perlu dicatat bahwa python memiliki banyak fleksibilitas ketika datang ke variabel class versus instance. Hal yang sama dapat dikatakan tentang metode. Untuk daftar kemungkinan yang bagus, saya sarankan membaca pengantar kelas gaya baru Michael Fötsch , terutama bagian 2 hingga 6.
Satu hal yang membutuhkan banyak pekerjaan untuk diingat ketika memulai adalah bahwa python bukan java. Lebih dari sekadar klise. Di java, seluruh kelas dikompilasi, membuat resolusi namespace menjadi sangat sederhana: variabel apa pun yang dideklarasikan di luar metode (di mana saja) adalah variabel instance (atau, jika statis, kelas) dan dapat diakses secara implisit dalam metode.
Dengan python, aturan utama adalah bahwa ada tiga ruang nama yang dicari, secara berurutan, untuk variabel:
- Fungsi / metode
- Modul saat ini
- Dibangun
{begin pedagogy}
Ada pengecualian terbatas untuk ini. Yang utama yang terjadi pada saya adalah bahwa, ketika definisi kelas sedang dimuat, definisi kelas adalah namespace implisit sendiri. Tapi ini hanya berlangsung selama modul dimuat, dan sepenuhnya dilewati ketika berada dalam suatu metode. Jadi:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
tapi:
>>> 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}
Pada akhirnya, hal yang perlu diingat adalah bahwa Anda tidak memiliki akses ke salah satu variabel yang ingin Anda akses, tapi mungkin tidak secara implisit. Jika sasaran Anda sederhana dan langsung, maka gunakan Foo.bar atau self.bar mungkin akan cukup. Jika contoh Anda menjadi lebih rumit, atau Anda ingin melakukan hal-hal mewah seperti warisan (Anda dapat mewarisi metode statis / kelas!), Atau gagasan merujuk nama kelas Anda di dalam kelas itu sendiri tampaknya salah bagi Anda, periksa intro yang saya tautkan.