如何在python中继承类(odoo框架控制器)

时间:2018-08-23 06:53:23

标签: python odoo

我在Python中遇到了继承问题。我希望程序输出是:

export(){
      var svg = this.shadowRoot.querySelector('svg');
      var xml = (new XMLSerializer).serializeToString(svg);
      var svg64 = 'data:image/svg+xml;base64,' + btoa(xml);
      var viewbox = svg.getAttribute('viewBox');

      var canvas = document.createElement("canvas");
      var width = viewbox.split(' ')[2],
          height = viewbox.split(' ')[3],
          ctx = canvas.getContext('2d');

      canvas.width = width;
      canvas.height = height;
      ctx.clearRect(0, 0, width, height); // clear canvas

      var img = new Image();

      img.onload = function () {
        ctx.drawImage(img, 0, 0);
        canvas.toBlob((b)=>{
          that.upload(b);
        });
        document.body.appendChild(img); //for visualising the results
      };

      img.src = svg64;
    }

# url: home/animal
response: CLASS: Animal | Ability : none

# url: home/animal/bird
response: CLASS: Bird | Ability : Fly

但是我得到以下输出:

# url: home/animal/fish
response: CLASS: Fish | Ability : Swim

# url: home/animal
response: CLASS: Fish | Ability : Swim

# url: home/animal/bird
response: CLASS: Fish | Ability : Swim

这是我的代码:

# url: home/animal/fish
response: CLASS: Fish | Ability : Swim

我已经阅读了很多有关继承的内容,但是仍然找不到解决此问题的方法。 可能是因为它在 odoo python中具有不同的系统吗?

编辑: 这是有效的代码,基于@Bruno的答案。

class Animal(http.Controller):
    name = 'Animal'
    ability = 'none'

    @http.route('/animal', auth='public', type='http', website=True, csrf=False)
    def util(self, **kwargs):
        return self.message()

    def message(self):
        return "Name: "+self.name +" | Ability : " + self.ability

class Bird(Animal):
    name = 'Bird'
    ability = 'fly'

    @http.route('/animal/bird', auth='public', type='http', website=True, csrf=False)
    def util1(self, **kwargs):
        return self.message()


class Fish(Animal):
    name = 'Fish'
    ability = 'swim'

    @http.route('/animal/fish', auth='public', type='http', website=True, csrf=False)
    def util2(self, **kwargs):
        return self.message()

2 个答案:

答案 0 :(得分:2)

注意事项:我完全没有使用过odoo,因此根据我从文档中所能获得的信息以及您所描述的行为,这个答案在一定程度上是疯狂的猜测。

According to the doc,看起来从控制器继承实际上将覆盖原始控制器,而不添加新控制器(nb cf上面的警告,好吗?)。如果是这样,您可以尝试的一件事是改用多重继承,将您的特定功能提取到非控制器基类中:

class Animal(object):
    name = 'Animal'
    ability = 'none'

    def message(self):
        # using string formatting for improved readability
        return "Name: {self.name} | Ability : {self.ability}".format(self=self)


class Bird(Animal):
    name = "Bird"
    ability = Fly

# etc

class AnimalController(Animal, http.Controller):
    @http.route('/animal', auth='public', type='http', website=True, csrf=False)
    def util(self, **kwargs):
        return self.message()

class BirdController(Bird, http.Controller):
    @http.route('/animal/bird', auth='public', type='http', website=True, csrf=False)
    def util(self, **kwargs):
        return self.message()

但是对我来说,这看起来并不是很好的设计。控制器通常可以处理许多路由(所有MVC Web框架都是这种情况,并且由于route装饰器将应用于方法,我认为此处的工作原理相同),因此仅保留它可能更简单一个控制器并委托给您的Animal层次结构:

class Animal(object):
    name = 'Animal'
    ability = 'none'

    def message(self):
        # using string formatting for improved readability
        return "Name: {self.name} | Ability : {self.ability}".format(self=self)


class Bird(Animal):
    name = "Bird"
    ability = Fly

# etc


class Controller(http.controller):
    def __init__(self, ...):
        self._animal = Animal()
        self._bird = Bird()
        # etc

    @http.route('/animal', auth='public', type='http', website=True, csrf=False)
    def animal(self, **kwargs):
        return self._animal.message()

    @http.route('/animal/bird', auth='public', type='http', website=True, csrf=False)
    def bird(self, **kwargs):
        return self._bird.message()

   # etc

这当然是不完整的示例代码,因此您可以大致理解,显然需要对其进行修改以符合odoo的期望和项目的需求。

答案 1 :(得分:0)

您实际上是在尝试继承http.controller吗?如果是这样,则Odoo中的默认0Auth模块也许可以向您展示它的排列方式(因为它也继承了此类)。

如果您只是想向Odoo添加一个新类,请注意它具有它自己的继承系统,该继承系统在文档中进行了描述(并且与默认python有很大不同): Odoo inheritance documentation for version 11.0

请注意,尽管我没有继承Odoo中除Odoo对象之外的任何东西的个人经验,但我在标准插件中发现了许多示例,这些示例可以帮助您。