python中继承的替代方法
如何在以下场景中保存代码重复 saypython中继承的替代方法,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
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,常规继承的问题在哪里?另请参见。另请参见。