如何在 python 中扩展类?

在 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函数时,它将返回字符串“扩展”的对象最后。它也应该从导入获得 init。

假设是 python 3.1

185264 次浏览

用途:

import color


class Color(color.Color):
...

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

class Color(object):
...

在 Python 3. x 中不需要这样做。

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.

例如,我这样做是为了扩展 Python2的 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 就完成了我想让它完成的任务。

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

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

class MyParent:


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


class ChildClass(MyParent):
pass

An instance of ChildClass will then inherit the sayHi() method.

我是这么用的。

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


def metodo1(self)
print(self.propriedade1)

to extend.

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()