我在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()
答案 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对象之外的任何东西的个人经验,但我在标准插件中发现了许多示例,这些示例可以帮助您。