Jika saya memiliki kode python berikut:
class Foo(object):
bar = 1
def bah(self):
print(bar)
f = Foo()
f.bah()
Itu mengeluh
NameError: global name 'bar' is not defined
Bagaimana saya bisa mengakses variabel kelas / statis bar
dalam metode bah
?
python
oop
static-variables
Ross Rogers
sumber
sumber
Jawaban:
Alih-alih
bar
menggunakanself.bar
atauFoo.bar
. Menetapkan keFoo.bar
akan membuat variabel statis, dan menugaskan keself.bar
akan membuat variabel contoh.sumber
Tentukan metode kelas:
Sekarang jika
bah()
harus metode instan (yaitu memiliki akses ke diri), Anda masih dapat langsung mengakses variabel kelas.sumber
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:
{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:
tapi:
{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.
sumber
sumber
sumber