我不确定我是否正确地问这个问题,但我知道你们都很聪明,可以解决这个问题:)。我在几个python类中压缩一些重复的代码时遇到了麻烦。这是我的意思的一个例子......
class Parent:
PATH_PROPERTIES = [ 'parent' ]
def __init__(self, path):
self.props = { 'parent': path }
def getPath(self):
return self.props['parent']
class Child(Parent):
PATH_PROPERTIES = [ 'child' ]
def __init__(self, path):
self.props = { 'child': path }
def getPath(self):
return self.props['child']
上面是目前的情况,但我想通过做类似的事情来减少一些重复......
class Parent:
name = 'parent'
PATH_PROPERTIES = [ name ]
def __init__(self, path):
self.props = ( name: path)
def getPath(self):
return self.props[name]
最后一点代码显然不起作用。我找不到任何关于Python能够做C ++的东西 - 比如宏。压缩此代码的最佳方法是什么?
答案 0 :(得分:2)
您可以使用继承:
class Parent:
PATH_PROPERTIES = [ 'parent' ]
def __init__(self, path):
self.props = { self.PATH_PROPERTIES[0]: path }
def getPath(self):
return self.props[self.PATH_PROPERTIES[0]]
class Child(Parent):
PATH_PROPERTIES = [ 'child' ]
c = Child('path')
print(c.getPath())
打印
path
请注意,在Python中,通常最好使用property而不是getter
函数:
class Parent:
PATH_PROPERTIES = 'parent'
def __init__(self, path):
self.props = { self.PATH_PROPERTIES: path }
@property
def path(self):
return self.props[self.PATH_PROPERTIES]
class Child(Parent):
PATH_PROPERTIES = 'child'
c = Child('path')
print(c.path)
还打印
path
请注意,c.path
看起来像属性查找,但由于path
是属性,因此调用用@property
修饰的函数。
语法看起来比c.getPath()
好,但却提供了相同的功能。有a decorator to make setters too。
答案 1 :(得分:1)
您通常应该通过一些重新设计来进行标准继承(如unutbu的答案),但您可以编写工厂函数来创建类。这可能与你在C ++中用宏做的最接近:
def make_class(name, base=object):
class Class(base):
PATH_PROPERTIES = [name]
def __init__(self, path):
self.props = {name: path}
@property
def path(self):
return self.props[name]
Class.__name__ = name.title()
return Class
Parent = make_class("parent")
Child = make_class("child", Parent)