Saya baru mengenal Python dan mencoba memahami apa cara paling benar untuk melakukan hal berikut:

Saya memiliki kelas dasar yang disebut "Sampel". Ini memiliki beberapa properti seperti dp, tp, dll.

Saya juga memiliki beberapa subkelas yang diturunkan dari basis ini seperti SampleA, SampleB, dll. Mereka memiliki beberapa properti yang berbeda satu sama lain. Salah satu properti dihitung dengan menggunakan properti khusus ini. Dan perhitungan ini cukup berulang, oleh karena itu saya ingin menulis satu metode dan memanggilnya di setiap kelas untuk menghitung nilai parameter.

class Sample(object):
    tp = 4
    dp = 4.2
    por = 0.007

    def common_method(self, arg1, arg2)
        return self.tp - arg1 * arg2

class SampleA(Sample)
    arg1 = 0.1
    arg2 = 2
    # I want to calculate arg3, but I don't know how to call the         
    # common_method here.

class SampleB(Sample)

.
.
.

Saya mencarinya sebelum mengajukan pertanyaan tetapi saya tidak melihat pertanyaan serupa.

Terima kasih banyak sebelumnya.

-1
mutotemiz 8 Agustus 2017, 19:04

2 jawaban

Jawaban Terbaik

Solusinya disarankan oleh dhke di komentar pertanyaan awal:

common_method() membutuhkan objek, tetapi Anda masih dalam deklarasi kelas. Apakah common_method() ada kegunaan lain? Karena dengan begitu Anda bisa menjadikannya metode kelas dan merujuknya oleh Sample.common_method()

Menerapkannya ke dalam kode akan lebih baik, saya pikir:

class Sample(object):
    tp = 4
    dp = 4.2
    por = 0.007

@classmethod
def common_method(self, arg1, arg2)
    return self.tp - arg1 * arg2

class SampleA(Sample)
    arg1 = 0.1
    arg2 = 2
    arg3 = Sample.common_method(arg1, arg2)  # 3.8

class SampleB(Sample):

.
.
.

Terima kasih banyak telah membantu saya dengan ini!

0
mutotemiz 8 Agustus 2017, 21:54

Ini mungkin salah satu contoh langka di mana metaclass masuk akal.

class CommonProperty(type):
    @property
    def common_property(cls):
        return cls.tp - cls.arg1 * cls.arg2

class Sample(object, metaclass=CommonProperty):
    tp = 4

class SampleA(Sample):
    arg1 = 0.2
    arg2 = 2

print(SampleA.common_property) # 3.6

Idenya adalah untuk menetapkan property ke metaclass yang diwarisi dan diselesaikan oleh subclass. Metaclass alami di sini karena tujuannya adalah untuk membuat class property daripada instance property dan class adalah instance dari metaclass.

0
Jared Goguen 8 Agustus 2017, 16:38