114

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を想定します

ありがとう

4

4 に答える 4

112

使用する:

import color

class Color(color.Color):
    ...

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

class Color(object):
    ...

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

于 2013-03-20T14:50:09.193 に答える
11
class MyParent:

    def sayHi():
        print('Mamma says hi')
from path.to.MyParent import MyParent

class ChildClass(MyParent):
    pass

その後、のインスタンスはメソッドChildClassを継承しsayHi()ます。

于 2020-12-21T20:27:30.777 に答える
1

こんな感じで使っています。

class menssagem:
  propriedade1 = "Certo!"
  propriedade2 = "Erro!"

def metodo1(self)
  print(self.propriedade1)

拡張します。

import menssagem
class menssagem2(menssagem):

  menssagem1 = None #não nescessario not necessary

  def __init__(self,menssagem):
    self.menssagem1 = menssagem

  #call first class method
  #usando o metodo da menssagem 1

  def Menssagem(self):
    self.menssagem1.metodo1()
于 2021-11-05T01:39:48.773 に答える
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にあります。

于 2019-05-08T15:41:16.393 に答える