1

我不确定我问的是否正确,但我知道你们都很聪明,可以弄清楚:)。我无法在一些 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++ 的宏的内容。压缩此代码的最佳方法是什么?

4

2 回答 2

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 中,通常最好使用属性而不是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(),但为您提供相同的功能。也有一个装饰器来制作二传手

于 2013-10-24T21:47:05.937 回答
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)
于 2013-10-24T21:57:49.210 回答