Я не уверен, что мой подход - хороший дизайн, и я надеюсь, что смогу получить совет. Я думаю где-то вдоль линии абстрактного метода, но в этом случае я хочу, чтобы этот метод был необязательным. Вот как я это делаю сейчас...
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, но я полностью намерен создавать дополнительные подклассы, которые могут иметь или не иметь метод createDrivers вообще! Поэтому я хочу, чтобы это было необязательным, и мне интересно, мой подход - это хорошо, если бы мой подход мог быть улучшен?
У вас все еще есть проблема, когда вы наследуете свой класс 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')
.
c = C()
как в моем примере, когда он вызывает c.createDrivers
это завершится ошибкой, так как createDrivers не реализован, что не похоже на AttributeError, потому что эта ошибка говорит о том, что используется неправильно, с другой стороны, другие методы не делают этого, если кто-то вызывает c.createDrivers
ничего не случится! просто тихая ошибка, метод просто существует и ничего не делает !! ??
Я бы сделал это:
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
Если вы хотите, чтобы 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
if callable
строка if callable
всегда будет оцениваться как true, нет?
if self._drivers:
или подобное после вызова self.createDrivers
.
import *
.