Python中的继承?

Python中的继承?,python,Python,假设我有以下python基类: class BaseClass(object): def a(): """This method uses method b(), defined in the inheriting class""" 也是一个继承基类的类: class UsedByUser(BaseClass): def b(): """b() is defined here, yet is used by the base class"""

假设我有以下
python
基类:

class BaseClass(object):
    def a():
        """This method uses method b(), defined in the inheriting class"""
也是一个继承基类的类:

class UsedByUser(BaseClass):
    def b():
        """b() is defined here, yet is used by the base class"""
我的用户只会创建类
usedbyser
的实例。典型的用途是:

if __name__ == '__main__':
    # initialize the class used by the user        
    usedByUser = UsedByUser()

    # invoke method a()
    usedByUser.a()


我的问题是,上述使用是否有问题?这是一种有效的方法,还是我必须在
BaseClass
中定义方法
b()
,然后在
UsedByUser
中重写它?

我也要在
BaseClass
中定义
b
方法:

class BaseClass(object):
    def b(self):
        raise NotImplementedError('b must be implemented by a subclass')
请记住:显式优于隐式,并且鉴于方法
a
需要方法
b
,最好提出一个有意义的异常,而不是一般的
AttributeError


值得指出的是,从语法的角度来看,这是绝对不需要的,但它增加了代码的清晰度,并强制子类提供实现。

基类不能假设UsedByUser对象存在,因此它不能从中使用B()方法。您可能希望在基类中定义一个B(),它要么什么都不做(如果用不支持它的东西尝试B()是明智的),要么引发一个异常(如果尝试B()是不明智的)

如果您告诉我们在您的用例中A和B是什么,我们可能会给您提供更好的建议。

  • 用法正确。类可以定义可以重写的方法 来自子类,但这些子类也可以定义新方法。决定性的 超类中的子类所需的每一种方法似乎都有点复杂 毫无意义。(既然
    对象
    那么也需要 功能定义?)

    一个子类通常与另一个子类具有不同的边界

    类别车辆(对象): def加油(自我): #

    等级飞机(车辆): def飞行(自我): #

    车辆类别: def驱动器(自): #

编辑:我误读了代码。

如果只创建它的一个子类,并确保子类具有
B()
,那么从理论上讲它是正常的,但样式不好。给出超类所使用的超类属性和方法更合理、更安全。->定义
B()
听起来像是希望
A
调用
usedbyser
的受保护成员函数,该函数不能进入抽象
基类
)。尝试用下划线作为受保护函数的前缀(请注意,这只是Python使用的约定,没有严格检查)

有关此约定的更多信息,请访问

编辑:


,为了清晰起见,我添加了一个
基类
\u B
方法。好小费

但在OP的示例中,
BaseClass
的方法需要一个子类
的方法。在
object
中,没有必要定义每个方法,因为object不需要它们。哈哈,对不起。你说得对。我没有足够好地阅读A()中的评论。谢谢你提供的详细答案。假设我也在
BaseClass()
中实现了
B()
(这意味着提供了一个真正的实现——而不是一个例外)。
usedbyser()
类中
B()
的实现是否总是覆盖
BaseClass()
B()
的定义?如果实例化
usedbyser
类,是的!谢谢你,皮特——回答得很好。OP没有提到方法
b
需要任何保护。停止用Java思考。。。你写的几乎每件事都不是富兰克林说的。另外,请阅读-1,这样的构造是合法和可能的,
abc
的存在是为了方便这种使用。“基类不能假设usedbyser对象存在”。这是真的。但它没有做出这样的假设(只有更普遍的假设,
b
),那么问题在哪里呢?这只是设计模式。
class BaseClass(object):
    def A(self):
        print "Grettings from A"
        self._B()
    def _B(self):
        raise NotImplementedError('b must be implemented by a subclass')

class UsedByUser(BaseClass):
    def _B(self):
        """ prefix with underscore is a python convention for a protected member function """
        print "B rocks!"

if ( __name__=='__main__' ):
    usedByUser = UsedByUser()
    usedByUser.A()