python中继承的替代方法

python中继承的替代方法,python,Python,如何在以下场景中保存代码重复 sayA和B是两个具有共同功能的类(比如说)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

如何在以下场景中保存代码重复

say
A
B
是两个具有共同功能的类(比如说)
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

有什么好的选择吗?

class A(object):
    name = 'foo'

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

class B(A):
    pass
在这种情况下,
B
将继承自
A


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

有什么原因不能让B继承自A吗

class B(A):
    name = 'bar'

有什么原因不能让B从a继承吗

class B(A):
    name = 'bar'

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

def get_name(object):
    return object.name

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

def get_name(object):
    return object.name

由于您正在使用
@property
装饰
name
,因此我假设您希望它成为一个实例变量。如果您想让它返回一个更私有的变量,让我们称之为
\u 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

中调用构造函数,因为您正在用
@property
装饰
name
,我假设您希望它是一个实例变量。如果您想让它返回一个更私有的变量,让我们称之为
\u 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
中调用构造函数假设
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.name
B.name
具有完全不同的行为,这将无法正常工作。如果
\u name
函数开始检查给定对象的类型,请首先重新考虑是否确实要抽象该功能。

假设
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.name
B.name
具有完全不同的行为,这将无法正常工作。如果
\u name
函数开始检查给定对象的类型,请首先重新考虑是否确实要抽象该功能。

好吧,A不是从B继承的。只是A中的B,常规继承的问题在哪里?A不是从B中继承的。只是A中的B,常规继承的问题在哪里?另请参见。另请参见。