簡體   English   中英

如何在python中擴展一個類?

[英]How to extend a class in python?

在python中你如何擴展一個類? 例如,如果我有

顏色.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。

假設 python 3.1

謝謝

采用:

import color

class Color(color.Color):
    ...

如果這是 Python 2.x,您還需要從object派生color.Color ,使其成為新式類

class Color(object):
    ...

這在 Python 3.x 中不是必需的。

class MyParent:

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

class ChildClass(MyParent):
    pass

ChildClass一個實例將繼承sayHi()方法。

另一種擴展(特別是添加新方法,而不是更改現有方法)類,甚至是內置類的方法是使用預處理器,它增加了擴展到 Python 本身范圍之外/之上的能力,將擴展轉換為在 Python 真正看到它之前的正常 Python 語法。

例如,我這樣做是為了擴展 Python 2 的str()類。 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上。

歐盟委員會:

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

def metodo1(self)
  print(self.propriedade1)

對擴展器:

import menssagem
class menssagem2(menssagem):

  menssagem1 = None #não nescessario

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

  #usando o metodo da menssagem 1
  def Menssagem(self):
    self.menssagem1.metodo1()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM