How to extend a class in python?

前端 未结 2 464
独厮守ぢ
独厮守ぢ 2020-12-13 12:00

In python how can you extend a class? For example if I have

color.py

class Color:
    def __init__(self, color):
        self.color = color
    def g         


        
相关标签:
2条回答
  • 2020-12-13 12:23

    Another way to extend (specifically meaning, add new methods, not change existing ones) classes, even built-in ones, is to use a preprocessor that adds the ability to extend out of/above the scope of Python itself, converting the extension to normal Python syntax before Python actually gets to see it.

    I've done this to extend Python 2's str() class, for instance. str() is a particularly interesting target because of the implicit linkage to quoted data such as 'this' and 'that'.

    Here's some extending code, where the only added non-Python syntax is the extend:testDottedQuad bit:

    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
    

    After which I can write in the code fed to the preprocessor:

    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'
    

    The preprocessor eats that, spits out normal Python without monkeypatching, and Python does what I intended it to do.

    Just as a c preprocessor adds functionality to c, so too can a Python preprocessor add functionality to Python.

    My preprocessor implementation is too large for a stack overflow answer, but for those who might be interested, it is here on GitHub.

    0 讨论(0)
  • 2020-12-13 12:35

    Use:

    import color
    
    class Color(color.Color):
        ...
    

    If this were Python 2.x, you would also want to derive color.Color from object, to make it a new-style class:

    class Color(object):
        ...
    

    This is not necessary in Python 3.x.

    0 讨论(0)
提交回复
热议问题