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関数を使用すると、文字列「extended!」のオブジェクトが返されると思います。最終的には。また、インポートからinitを取得する必要があります。

Python3.1を想定します

ありがとう


2
ドキュメントを読み込もうとしましたか? docs.python.org/2.7/tutorial/classes.html#inheritance
wRAR

クラスの最初の文字は大文字にする必要があります(「色」ではなく「色」);)
daveoncode 2013年

14
@wRAR 2013年にはこれは妥当な質問かもしれませんが、正直に言うと、人々は最初にStackOverflowに目を向けるので、これはSOに関する良い質問です。この質問は「pythonextendclass」の最初のグーグルヒットであり、ドキュメントは3番目です。
TCプロクター

回答:


94

使用する:

import color

class Color(color.Color):
    ...

これがPython2.xの場合は、から派生color.Colorobjectて、新しいスタイルのクラスにすることもできます。

class Color(object):
    ...

これはPython3.xでは必要ありません。


31
新しいクラスに古いクラスと同じ名前を付けることができることに注意してください。古いclass color(color):クラスを置き換えるが、それから派生した新しいクラスを定義します。(これはOP
がやろ

17
class extended_color(color):通常は悪い基準です-class ExtendedColor(Color):クラス用である必要があります。ちょっとしたこと
TyrantWave

ここでNoobの質問:なぜ使用しなかったのです__init__か?
メンタリスト

0

クラスを拡張する(具体的には、既存のメソッドを変更するのではなく、新しいメソッドを追加する)別の方法は、組み込みのクラスであっても、Python自体の範囲外/範囲を超えて拡張する機能を追加するプリプロセッサを使用して、拡張機能をに変換することです。 Pythonが実際にそれを見る前の通常のPython構文。

str()たとえば、Python2のクラスを拡張するためにこれを行いました。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は私が意図したことを実行します。

acプリプロセッサがcに機能を追加するのと同じように、PythonプリプロセッサもPythonに機能を追加できます。

私のプリプロセッサの実装はスタックオーバーフローの答えには大きすぎますが、興味があるかもしれない人のために、それはここGitHubにあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.