python中面向对象的设计

时间:2015-08-06 18:20:23

标签: python

我有基本功能

 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() ..变量名是常见的..但它是不同的字符串赋值..跨这个基类的不同实现。?

2 个答案:

答案 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充当属性时才会使用(也就是说,它不会“通过魔法”改变,取而代之的是相对便宜且无明显副作用等。)。