1

如何在以下情况下保存代码重复?

AB是两个具有共同功能的类(说)name

class A(object):
    name = 'foo'

    @property
    def name(self):  # the common function
        return self.name

同样B

class B(object):
    name = 'bar'

    @property
    def name(self):
        return self.name

一种方法是创建一个类,它们都从中继承并name在那里定义。

有什么好的选择吗?

4

5 回答 5

1

如果您真的决定避免继承,只需在任一类之外定义一个函数:

def get_name(object):
    return object.name
于 2013-07-16T03:15:56.173 回答
0

由于您使用 装饰name@property我假设您希望它成为实例变量。如果你想让它返回一个更私有的变量,让我们称之为它_name,你必须这样做:

class A(object):
    def __init__(self):
        self._name = 'foo'

    @property
    def name(self):
        return self._name

您不能同时让变量和函数具有相同的名称,因为后者将简单地覆盖前者。如果你想要一个处理这个问题的基类,它看起来像这样:

class HasName(object):
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name

class A(HasName):
     def __init__(self):
         self._name = 'foo'

class B(HasName):
     def __init__(self):
         self._name = 'bar'

也可以调用构造函数HasName

于 2013-07-16T03:20:36.207 回答
0

假设self.name代表一个更复杂的方法,减少重复代码的最简单方法是将函数移出模块并让它接受任意对象作为参数。然后,如果您仍然想将方法直接绑定到类,您可以添加一个短的方法来分派到模块函数。

def _name(obj):
    return obj.name

class A(object):
     # ...

     @property
     def name(self):
         return _name(self)

class B(object):
     # ...

     @property
     def name(self):
         return _name(self)

请注意,如果并且具有完全不同的行为,这将无法正常工作。如果函数开始检查给定对象的类型,请重新考虑您是否真的要首先抽象该功能。A.nameB.name_name

于 2013-07-16T03:26:28.673 回答
0
class A(object):
    name = 'foo'

    def get_name(self):  # the common function
        return self.name

class B(A):
    pass

在这种情况下B将继承自A

于 2013-07-16T03:09:04.670 回答
0

有没有理由不能让 B 从 A 继承?

class B(A):
    name = 'bar'
于 2013-07-16T03:09:35.240 回答