114

在 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函数时,它将返回带有字符串“扩展!”的对象。到底。它也应该从导入中得到初始化。

假设 python 3.1

谢谢

4

4 回答 4

112

利用:

import color

class Color(color.Color):
    ...

如果这是 Python 2.x,您还需要color.Colorobject, 派生以使其成为新型类

class Color(object):
    ...

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

于 2013-03-20T14:50:09.193 回答
11
class MyParent:

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

class ChildClass(MyParent):
    pass

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

于 2020-12-21T20:27:30.777 回答
1

我像这样使用它。

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

def metodo1(self)
  print(self.propriedade1)

延长。

import menssagem
class menssagem2(menssagem):

  menssagem1 = None #não nescessario not necessary

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

  #call first class method
  #usando o metodo da menssagem 1

  def Menssagem(self):
    self.menssagem1.metodo1()
于 2021-11-05T01:39:48.773 回答
0

扩展(特别是添加新方法,而不是更改现有方法)类的另一种方法,甚至是内置类,是使用预处理器添加扩展 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 上。

于 2019-05-08T15:41:16.393 回答