Як розширити клас на python?


92

Як ви можете розширити клас у python? Наприклад, якщо я маю

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

Але це не працює ... Я думаю, що якщо я працюю color_extended.py, тоді, коли я створюю кольоровий об'єкт і використовую getcolorфункцію, він поверне об'єкт із рядком "розширено!" наприкінці. Крім того, він повинен був отримати init від імпорту.

Припустимо, що python 3.1

Дякую


2
Ви намагалися прочитати документацію? docs.python.org/2.7/tutorial/classes.html#inheritance
wRAR 20.03.13

класи повинні мати першу літеру з великої літери ("Колір", а не "колір");)
daveoncode

14
@wRAR Можливо, у 2013 році це розумне запитання, але давайте будемо чесними - люди спочатку звертаються до StackOverflow, тому це гарне запитання щодо SO. Це питання є першим зверненням Google до "розширеного класу python", документація - третім.
TC Proctor

Відповіді:


94

Використання:

import color

class Color(color.Color):
    ...

Якби це був Python 2.x, ви також хотіли б походити color.Colorз object, щоб зробити його класом нового стилю :

class Color(object):
    ...

Це не потрібно в Python 3.x.


31
Варто зазначити, що ви можете дати новому класу те саме ім'я, що і старому: class color(color):визначає новий клас, який замінює старий, але який походить від нього. (Здається, це те, що намагається зробити ОП.)
kindall

17
class extended_color(color):зазвичай погані стандарти - це class ExtendedColor(Color):повинно бути для занять. Just a nitpick
TyrantWave

Noob питання тут: чому ви не використовували __init__?
Менталіст

0

Інший спосіб розширення (зокрема значення, додавання нових методів, а не зміна існуючих) класів, навіть вбудованих, полягає у використанні препроцесора, який додає можливість розширення за межі самого Python, перетворюючи розширення на звичайний синтаксис Python до того, як Python насправді побачить його.

str()Наприклад, я зробив це, щоб розширити клас Python 2 . str()є особливо цікавою метою через неявний зв'язок із цитованими даними, такими як 'this'і 'that'.

Ось деякий розширювальний код, де єдиним доданим не-Python синтаксисом є extend:testDottedQuadбіт:

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

Після чого я можу написати в коді, поданому на препроцесор:

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'

Препроцесор з’їдає це, випльовує звичайний Python без виправлення мавп, і Python робить те, що я задумав.

Подібно до того, як препроцесор змінного струму додає функціональність до c, так само препроцесор Python може додати функціональність до Python.

Моя реалізація препроцесора завелика для відповіді на переповнення стека, але для тих, кого це може зацікавити, вона знаходиться тут, на GitHub.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.