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 getcolor
fungsinya maka itu akan mengembalikan objek dengan string "diperpanjang!" pada akhirnya. Juga harus mendapatkan init dari impor.
Asumsikan python 3.1
Terima kasih
Jawaban:
Menggunakan:
import color class Color(color.Color): ...
Jika ini adalah Python 2.x, Anda juga ingin mendapatkan
color.Color
dariobject
, untuk menjadikannya kelas gaya baru :class Color(object): ...
Ini tidak diperlukan dalam Python 3.x.
sumber
class color(color):
mendefinisikan kelas baru yang menggantikan yang lama, tetapi yang diturunkan darinya. (Tampaknya inilah yang OP coba lakukan.)class extended_color(color):
adalah standar yang buruk biasanya -class ExtendedColor(Color):
seharusnya untuk kelas. Hanya nitpick__init__
?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:testDottedQuad
bitnya: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.
sumber