Bagaimana cara memperluas kelas dengan python?

92

Dengan python, bagaimana Anda bisa memperluas kelas? Misalnya jika saya punya

color.py

class Color:
    def __init__(self, color):
        self.color = color
    def getcolor(self):
        return self.color

color_extended.py

import Color

class Color:
    def getcolor(self):
        return self.color + " extended!"

Tapi ini tidak berhasil ... Saya berharap bahwa jika saya bekerja color_extended.py, maka ketika saya membuat objek warna dan menggunakan getcolorfungsinya maka itu akan mengembalikan objek dengan string "diperpanjang!" pada akhirnya. Juga harus mendapatkan init dari impor.

Asumsikan python 3.1

Terima kasih

akhir
sumber
2
Apakah Anda mencoba membaca dokumentasi? docs.python.org/2.7/tutorial/classes.html#inheritance
wRAR
kelas harus menggunakan huruf besar pertama ("Color" bukan "color");)
daveoncode
14
@wRAR Mungkin pada tahun 2013 ini adalah pertanyaan yang masuk akal, tapi mari kita jujur ​​- orang-orang beralih ke StackOverflow terlebih dahulu, jadi ini adalah pertanyaan yang bagus untuk dimiliki di SO. Pertanyaan ini adalah yang pertama dipukul google untuk "python extends class", dokumentasinya ada di urutan ketiga.
TC Proctor

Jawaban:

94

Menggunakan:

import color

class Color(color.Color):
    ...

Jika ini adalah Python 2.x, Anda juga ingin mendapatkan color.Colordari object, untuk menjadikannya kelas gaya baru :

class Color(object):
    ...

Ini tidak diperlukan dalam Python 3.x.

NPE
sumber
31
Perlu dicatat bahwa Anda dapat memberi kelas baru nama yang sama dengan yang lama: class color(color):mendefinisikan kelas baru yang menggantikan yang lama, tetapi yang diturunkan darinya. (Tampaknya inilah yang OP coba lakukan.)
saja
17
class extended_color(color):adalah standar yang buruk biasanya - class ExtendedColor(Color):seharusnya untuk kelas. Hanya nitpick
TyrantWave
Pertanyaan noob di sini: mengapa Anda tidak menggunakan __init__?
Mentalist
0

Cara lain untuk memperluas (secara khusus artinya, menambahkan metode baru, bukan mengubah yang sudah ada) kelas, bahkan yang sudah ada di dalamnya, adalah dengan menggunakan preprocessor yang menambahkan kemampuan untuk memperluas / di atas cakupan Python itu sendiri, mengubah ekstensi menjadi sintaks Python normal sebelum Python benar-benar melihatnya.

Saya telah melakukan ini untuk memperluas str()kelas Python 2 , misalnya. str()adalah target yang sangat menarik karena keterkaitan implisit ke data yang dikutip seperti 'this'dan 'that'.

Berikut beberapa kode tambahan, di mana satu-satunya sintaks non-Python yang ditambahkan adalah extend:testDottedQuadbitnya:

extend:testDottedQuad
def testDottedQuad(strObject):
    if not isinstance(strObject, basestring): return False
    listStrings = strObject.split('.')
    if len(listStrings) != 4: return False
    for strNum in listStrings:
        try:    val = int(strNum)
        except: return False
        if val < 0: return False
        if val > 255: return False
    return True

Setelah itu saya dapat menulis kode yang diumpankan ke preprocessor:

if '192.168.1.100'.testDottedQuad():
    doSomething()

dq = '216.126.621.5'
if not dq.testDottedQuad():
    throwWarning();

dqt = ''.join(['127','.','0','.','0','.','1']).testDottedQuad()
if dqt:
    print 'well, that was fun'

Preprocessor memakannya, mengeluarkan Python normal tanpa monkeypatching, dan Python melakukan apa yang saya inginkan.

Seperti preprocessor ac yang menambahkan fungsionalitas ke c, begitu juga preprocessor Python dapat menambahkan fungsionalitas ke Python.

Pelaksanaan preprocessor saya terlalu besar untuk jawaban stack overflow, tetapi bagi mereka yang mungkin tertarik, itu adalah di sini di GitHub.

fyngyrz.dll
sumber