Bagaimana dan di mana menghitung variabel instan turunan dengan python

Saya memiliki kelas dengan variabel instan str. Dari variabel instan ini, saya menghitung variabel instan kedua, yang pada dasarnya hanyalah string yang dipecah menjadi 'atom' tertentu. Variabel instan kedua sepenuhnya ditentukan oleh variabel instan pertama. Saya menjadikannya variabel instan karena menurut saya ini paling baik dianggap sebagai 'properti' kelas. Saya agak tidak yakin tentang cara memperlakukan variabel instan turunan. Secara khusus:

1) Menurut saya, properti tersebut seharusnya hanya dapat diperoleh. Namun, karena perhitungan variabel instan turunan cukup intensif, saya ingin hal itu dilakukan saat kelas dimulai, bukan saat variabel dipanggil. 2) Jika saya membuat fungsi murni untuk menghitung variabel instan, apakah ada cara untuk menandainya? 3) Juga, haruskah saya meneruskan variabel instan pertama sebagai parameter, atau hanya membacanya dalam metode dari diri sendiri? (secara umum saya masih sedikit tidak yakin kapan harus meneruskan variabel instan sebagai parameter ke metode.) 4) Apakah ada cara yang lebih baik untuk melakukan ini yang belum saya sebutkan? Terima kasih

EDIT: Berikut adalah contoh sederhana dari apa yang saya maksud:

class Amendment:

    def __init__(self, string):
        self.string = string
        self.atoms = generate_atoms()


    def generate_atoms():
        return do_something_that_takes_long(self.string)

person Neil    schedule 20.05.2018    source sumber
comment
Kemungkinan besar Anda akan mendapatkan bantuan dalam hal ini jika Anda memposting contoh kecil sehingga kami tahu persis bagaimana Anda membuat kelas ini (kami tidak perlu melihat detail algoritme pembuatan atom Anda yang sebenarnya, versi yang disederhanakan sudah cukup) . Dan dengan cara itu kita dapat menggunakan nama atribut dari kode Anda, daripada harus membicarakan variabel instan pertama, dll.   -  person PM 2Ring    schedule 20.05.2018
comment
Sementara itu, apakah variabel instance pertama berubah selama masa pakai instance?   -  person PM 2Ring    schedule 20.05.2018
comment
Diedit. Dan tidak, variabel instan pertama tidak akan diubah. Oleh karena itu, penghitungan atom dapat terjadi satu kali dan kemudian bertahan pada objek tersebut selamanya.   -  person Neil    schedule 20.05.2018
comment
Terima kasih. Jadi Anda ingin .string dan .atoms menjadi properti get-only?   -  person PM 2Ring    schedule 20.05.2018
comment
Ya .string juga akan menjadi poperty get only   -  person Neil    schedule 20.05.2018


Jawaban (1)


Anda lupa self di beberapa tempat. Namun berikut cara membuat properti get-only .string dan .atoms. Kami menggunakan beberapa atribut "private" yang dibuat selama __init__, dan gunakan @property untuk membuat pengambil yang sebenarnya.

class Amendment:
    def __init__(self, string):
        self._string = string
        self._atoms = self.generate_atoms()

    def generate_atoms(self):
        #return do_something_that_takes_long(self.string)
        return list(self.string)

    @property
    def string(self):
        return self._string

    @property
    def atoms(self):
        return self._atoms

# Test

a = Amendment('abc')
print(a.string, a.atoms)
# This will raise an error because `.string` is a get-only property.
a.string = 'xyz'

keluaran

abc ['a', 'b', 'c']
Traceback (most recent call last):
  File "./qtest.py", line 53, in <module>
    a.string = 'xyz'
AttributeError: can't set attribute

Jika mau, Anda juga dapat menandai generate_atoms sebagai pribadi, namun mungkin tidak perlu. Dan tidak ada yang menghentikan pengguna yang mendesak untuk mengakses hal-hal seperti itu, seperti yang dijelaskan dalam dokumen tertaut.

Sedangkan untuk pertanyaan ke-3 Anda, metode biasanya mengakses atribut yang mereka perlukan melalui self. Dalam beberapa kasus, Anda dapat menggunakan metode yang sama pada atribut yang berbeda, dan kemudian masuk akal untuk meneruskan atribut tersebut sebagai parameter, tetapi jika tidak demikian maka akan terlihat aneh. ;)

person PM 2Ring    schedule 20.05.2018
comment
Luar biasa, ini terlihat rapi. Terima kasih! - person Neil; 20.05.2018
comment
@Neil Jangan khawatir. Saya telah menambahkan beberapa komentar lagi pada jawaban saya. - person PM 2Ring; 20.05.2018