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 for Mayaで2つの円弧を作成していますが、createDriversメソッドがある場合とない場合があるサブクラスをさらに作成するつもりです。だから私はそれをオプションにしたいのですが、私のアプローチが改善できるかどうか疑問に思っています。

4

3 に答える 3

3

クラスBを継承するときにまだ問題があり、これが呼び出さ れ、サブクラスにA.__init__実装しない場合、この行は存在しないためエラーがスローされます(AttributeError)私はあなただったと思います次のようにします:createDriverscallable(self.createDrivers)createDrivers

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 に答える