2

我不确定我的方法是否是好的设计,我希望我能得到一个小费。我正在考虑抽象方法的某个地方,但在这种情况下,我希望该方法是可选的。这就是我现在正在做的...

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 中为 Maya 创建了 2 个圆弧,但我完全打算创建更多可能有也可能没有 createDrivers 方法的子类!所以我希望它是可选的,我想知道我的方法是否——好吧,我的方法是否可以改进?

4

3 回答 3

3

你仍然有一个问题,当你将继承你的 B 类时,这将调用 A.__init__,如果你没有createDrivers在子类中实现这一行将callable(self.createDrivers)抛出一个错误,因为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').

于 2011-01-16T09:11:37.147 回答
1

我会这样做:

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
于 2011-01-16T09:48:09.667 回答
1

如果您希望 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
于 2011-01-16T09:49:10.403 回答