在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
由于
答案 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。