如何在python中扩展一个类?

时间:2013-03-20 14:48:41

标签: python class interface

在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!”的对象。到底。此外,它应该从导入gotton init。

假设python 3.1

由于

3 个答案:

答案 0 :(得分:76)

使用:

import color

class Color(color.Color):
    ...

如果这是Python 2.x,您还希望从color.Color派生object,使其成为new-style class

class Color(object):
    ...

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

答案 1 :(得分:4)

class MyParent:

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

class ChildClass(MyParent):
    pass

然后 ChildClass 的实例将继承 sayHi() 方法。

答案 2 :(得分:-1)

另一种扩展(特别是含义,添加新方法,而不更改现有方法)类(甚至是内置类)的方法是使用预处理器,该预处理器增加了扩展超出Python自身范围/超出其范围的能力,从而进行了转换普通的Python语法的扩展,在Python真正看到它之前。

例如,我这样做是为了扩展Python 2的function patch<K extends keyof Item>(item: Item, key: K, value: Item[K]): Item { return { ...item, [key]: value }; } declare const item: Item; patch(item, 7, false); // error! 7 is not a key, false is not a value patch(item, "name", 14); // error! 14 is not a string patch(item, "name", "okay"); // works patch(item, "amount", 14); // okay 类。由于str()str()等引用数据的隐式链接,'this'是一个特别有趣的目标。

以下是一些扩展代码,其中唯一添加的非Python语法是'that'位:

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

预处理器会吃掉它,吐出普通的Python而不会进行猴子补丁操作,Python会按照我的意图去做。

就像c预处理器向c添加功能一样,Python预处理器也可以向Python添加功能。

我的预处理器实现对于堆栈溢出答案来说太大了,但是对于那些有兴趣的人来说,它是GitHub上的here