Python中的继承?

2024-10-03 04:38:30 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下python基类:

class BaseClass(object):
    def a():
        """This method uses method b(), defined in the inheriting class"""

以及继承BaseClass的类:

^{pr2}$

{My user}只创建类的实例。典型用途是:

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

    # invoke method a()
    usedByUser.a()

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


Tags: theinobjectdefthis基类methodclass
3条回答
  • 使用正确。类可以定义可以重写的方法 来自子类,但这些也可以定义新方法。定义 超类中的子类所需的每个方法似乎都有点像 毫无意义。(因为object那么还需要 功能定义?)在

    一个子类通常与另一个子类具有不同的bahviour。在

    类别车辆(对象): def加油(自行): # ... 在

    等级飞机(车辆): def Fly(自我): # ... 在

    等级车(车): def驱动(自身): # ...

编辑:我误读了代码。
如果只有您创建了它的一个子类,并确保子类具有B(),那么理论上是可以的,但是样式不好。提供超类所使用的属性和方法更合理、更安全。->;定义B()

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

class BaseClass(object):
    def b(self):
        raise NotImplementedError('b must be implemented by a subclass')

记住:显式比隐式好,而且鉴于方法a无论如何都需要方法b,最好引发有意义的异常,而不是一般的AttributeError。在

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

听起来好像您希望A调用UsedByUser的受保护成员函数,该函数不能进入抽象BaseClass)。尝试在受保护的函数前面加下划线(尽管注意这只是Python使用的一个约定,没有严格检查,as mentioned here)。在

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()

PEP guidelines中查找有关此约定的更多信息。在

编辑:

As GaretJax suggested,为了清晰起见,我添加了一个BaseClass_B方法。小费不错!在

相关问题 更多 >