Python'da bir sınıf nasıl genişletilir?


92

Python'da bir sınıfı nasıl uzatabilirsiniz? Örneğin eğer varsa

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!"

Ama bu işe yaramıyor ... Eğer içinde çalışırsam color_extended.py, bir renk nesnesi yapıp getcolorişlevi kullandığımda , nesneyi "genişletilmiş!" Dizesiyle geri döndürmesini bekliyorum. Sonunda. Ayrıca ithalattan init alması gerekirdi.

Python 3.1 varsayalım

Teşekkürler


2
wRAR

sınıfların ilk harfi büyük olmalıdır ("Renk", "renk" değil);)
daveoncode

14
@wRAR Belki 2013'te bu makul bir sorudur, ancak dürüst olalım - insanlar önce StackOverflow'a yöneliyor, bu yüzden bu SO'da sorulması gereken iyi bir soru. Bu soru "python ext class" için ilk google hit, dokümantasyon ise üçüncü.
TC Proctor

Yanıtlar:


94

Kullanım:

import color

class Color(color.Color):
    ...

Bu Python 2.x olsaydı, ayrıca türetmek isteyeyim color.Colorgelen objectbir hale getirmek için, yeni tarzı sınıfı :

class Color(object):
    ...

Python 3.x'te bu gerekli değildir.


31
Yeni sınıfa eskisi ile aynı adı verebileceğinizi belirtmek gerekir: class color(color):eskisinin yerine geçen ancak ondan türetilen yeni bir sınıfı tanımlar. (Bu, OP'nin yapmaya çalıştığı şey gibi görünüyor.)
nazikçe

17
class extended_color(color):standartlar genellikle kötü - class ExtendedColor(Color):sınıflar için olmalıdır. Just a nitpick
TyrantWave

Noob sorusu burada: neden kullanmadın __init__?
Mentalist

0

Sınıfları, hatta yerleşik olanları bile genişletmenin (özellikle, yeni yöntemler eklemenin, mevcut olanları değiştirmemenin) başka bir yolu, Python'un kendi kapsamının dışına / dışına genişletme yeteneği ekleyen bir ön işlemci kullanmaktır. Python gerçekten onu görmeden önce normal Python sözdizimi.

str()Örneğin bunu Python 2'nin sınıfını genişletmek için yaptım . ve str()gibi alıntılanan verilere örtük bağlantı nedeniyle özellikle ilginç bir hedeftir .'this''that'

Python dışı eklenen tek sözdiziminin extend:testDottedQuadbit olduğu bazı genişletme kodları aşağıda verilmiştir :

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

Bundan sonra önişlemciye beslenen kodda yazabilirim:

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'

Önişlemci bunu yiyor, normal Python'u monkeypatching yapmadan tükürüyor ve Python benim yapmak istediğim şeyi yapıyor.

Tıpkı ac ön işlemcisinin c'ye işlevsellik katması gibi, bir Python ön işlemcisi de Python'a işlevsellik ekleyebilir.

Önişlemci uygulamam bir yığın taşması yanıtı için çok büyük, ancak ilgilenebilecekler için burada GitHub'da.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.