如何延长蟒蛇一类?(How to extend a class in python?)

2019-07-22 03:53发布

在蟒蛇怎么能扩展一个类? 例如,如果我有

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函数,那么将返回对象以字符串“相助!” 到底。 此外,它应该gotton从进口初始化。

假设蟒蛇3.1

谢谢

Answer 1:

使用:

import color

class Color(color.Color):
    ...

如果是这样的Python 2.x中,你也想获得color.Colorobject ,使之成为新式类 :

class Color(object):
    ...

这是没有必要在Python 3.x的



Answer 2:

另一种方式来扩展(具体意思,添加新的方法,不改变现有的)类,甚至内置的,是使用一个预处理器,增加了延伸出的/上面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没有的Monkeypatching和Python做什么,我打算做的事。

正如AC预处理将功能添加到C,所以也可以在Python的预处理功能添加到Python。

我的预处理器的实施是一个堆栈溢出的答案太大,但对于那些谁可能会感兴趣,它是这里在GitHub上。



文章来源: How to extend a class in python?