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