我应该在这个Python场景中使用抽象方法吗?

2024-10-01 09:34:51 发布

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

我不确定我的方法是好的设计,我希望我能得到一个提示。我在想一个抽象方法,但在本例中,我希望方法是可选的。我现在就是这样做的。。。在

from pymel.core import *

class A(object):
    def __init__(self, *args, **kwargs):
        if callable(self.createDrivers):
            self._drivers = self.createDrivers(*args, **kwargs)
            select(self._drivers)

class B(A):
    def createDrivers(self, *args, **kwargs):
        c1 = circle(sweep=270)[0]
        c2 = circle(sweep=180)[0]
        return c1, c2

b = B()

在上面的例子中,我只是在PyMEL for Maya中创建了2个圆弧,但我完全打算创建更多的子类,这些子类可能有也可能根本没有createDrivers方法!所以我希望它是可选的,我想知道我的方法是否好,我的方法是否可以改进?在


Tags: 方法fromselfdefargs子类kwargsclass
3条回答

你仍然有一个问题,当你继承你的类B,这将调用A.__init__,如果你不在子类中实现createDrivers,这行callable(self.createDrivers)将抛出一个错误,因为{}不存在(AttributeError)我想如果我是你,我会这样做:

class A(object):
    def __init__(self, *args, **kwargs):
       try:
           self._drivers = self.createDrivers(*args, **kwargs)
           select(self._drivers)
       except NotImplementedError:
           pass

    def createDrivers(self, *args, **kwargs):
        raise NotImplementedError("This class wasn't implemented")

class B(A):
    def createDrivers(self, *args, **kwargs):
        c1 = circle(sweep=270)[0]
        c2 = circle(sweep=180)[0]
        return c1, c2

class C(A):
    pass

另一种方法是将callable(self.createDrivers)替换为hasattr(self, 'createDrivers')。在

如果您希望createDrivers是可选的,但仍然存在,那么最好的方法不是抽象方法,而是将其作为noop在基类中实现。在

class A(object):
    def __init__(self, *args, **kwargs):
        self._drivers = self.createDrivers(*args, **kwargs)
        select(self._drivers)

    def createDrivers(self, *args, **kwargs):
        """This should be overridden by subclasses if they need custom drivers"""
        pass

我会这样做:

class A(object):
    def __init__(self, *args, **kwargs):
        self.createDrivers(*args, **kwargs)

    def createDrivers(self, *args, **kwargs):
        "Override"
        pass

class B(A):
    def createDrivers(self, *args, **kwargs):
        self._drivers = blabla

相关问题 更多 >