我有基本功能
class Foo(object):
def method(self):
return True # or False based on custom logic for each class that will implement this class
def almost_common_method(self, params, force):
if self.method():
params.bleh = 'foo bar'
else:
params.bleh = 'not foo bar'
if force:
foobar = some_foo_bar(model_name = 'foo bar')
else:
default = Default()
def common_method(self, params, force):
return self.almost_common_method(params, force)
所以,我正在考虑创建一个基类... where方法引发NotImplementedError
我在基类中实现了common_method(),因为它将在继承基类的所有类之间共享?
但有没有办法在基类中定义almost_common_method()
..变量名是常见的..但它是不同的字符串赋值..跨这个基类的不同实现。?
答案 0 :(得分:1)
在基类中定义almost_common_method
,但使用类属性参数化您指定的值:
class Base(object):
BLEH_IF_METHOD = 'foo bar'
BLEH_IF_NOT_METHOD = 'not foo bar'
def almost_common_method(self, params, force):
if self.method():
params.bleh = self.BLEH_IF_METHOD
else:
params.bleh = self.BLEAH_IF_NOT_METHOD
if force:
foobar = some_foo_bar(model_name = 'foo bar')
else:
default = Default()
然后在子类中,只需覆盖两个类属性的值,并按原样使用继承的方法。
class Child(Base):
BLEH_IF_METHOD = 'child bleh'
BLEH_IF_NOT_METHOD = 'not child bleh'
答案 1 :(得分:1)
这非常适合template method pattern。将字符串分解为单独的方法:
class FooBase(object):
@property
def bleh(self):
raise NotImplementedError()
# consider making this an abstract base class with the abc module
def almost_common_method(self, params, force):
params.bleh = self.bleh
if force:
foobar = some_foo_bar(model_name = 'foo bar')
else:
default = Default()
class Foo(FooBase):
@property
def bleh(self):
if self.method():
return 'foo bar'
else:
return 'not foo bar'
每个子类都可以使用自己独立的实现覆盖bleh
。
@property
的使用是可选的,通常只有在您期望bleh
充当属性时才会使用(也就是说,它不会“通过魔法”改变,取而代之的是相对便宜且无明显副作用等。)。