如何在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!”的对象。到底。另外它也应该从导入中获取初始化。

假设python 3.1

谢谢



类的首字母应大写(“颜色”而非“颜色”);)
daveoncode 2013年

14
@wRAR也许在2013年,这是一个合理的问题,但老实说-人们首先转向StackOverflow,所以这是一个很好的问题。这个问题是Google针对“ python扩展类”的首次命中,文档是第三位。
TC Proctor

Answers:


94

使用:

import color

class Color(color.Color):
    ...

如果是这样的Python 2.x中,你也想得出color.Colorobject,使它成为一个新式类

class Color(object):
    ...

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


31
值得一提的是,您可以为新类赋予与旧类相同的名称:class color(color):定义一个新类来替代旧类,但该新类是从旧类派生而来的。(这似乎是OP试图做的。)
kindall 2013年

17
class extended_color(color):通常是不好的标准-class ExtendedColor(Color):应该用于课程。只是
个小问题

Noob在这里提问:您为什么不使用__init__
心理学家

0

扩展(特别是意味着,添加新方法,而不更改现有方法)类(甚至是内置类)的另一种方法是使用预处理器,该预处理器添加了扩展功能,使其能够扩展/超出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上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.