如何在python中继承类(odoo框架控制器)
我在Python中遇到了一个继承问题。我希望by程序的输出为:如何在python中继承类(odoo框架控制器),python,odoo,Python,Odoo,我在Python中遇到了一个继承问题。我希望by程序的输出为: #url:home/animal 回答:班级:动物|能力:无 #url:home/animal/bird 回答:职业:鸟|能力:飞 #url:home/animal/fish 回答:班级:鱼|能力:游泳 但我得到以下输出: #url:home/animal 回答:班级:鱼|能力:游泳 #url:home/animal/bird 回答:班级:鱼|能力:游泳 #url:home/animal/fish 回答:班级:鱼|
#url:home/animal
回答:班级:动物|能力:无
#url:home/animal/bird
回答:职业:鸟|能力:飞
#url:home/animal/fish
回答:班级:鱼|能力:游泳
但我得到以下输出:
#url:home/animal
回答:班级:鱼|能力:游泳
#url:home/animal/bird
回答:班级:鱼|能力:游泳
#url:home/animal/fish
回答:班级:鱼|能力:游泳
这是我的密码:
类动物(http.Controller):
名称=‘动物’
能力=‘无’
@http.route('/animal',auth='public',type='http',website=True,csrf=False)
def util(自身,**kwargs):
返回self.message()
def消息(自我):
返回“姓名:+self.Name+”|能力:+self.Ability
鸟类(动物)类别:
名称='Bird'
能力=‘飞行’
@http.route('/animal/bird',auth='public',type='http',website=True,csrf=False)
def util1(自身,**kwargs):
返回self.message()
鱼类(动物)类别:
名称=‘鱼’
能力=‘游泳’
@http.route('/animal/fish',auth='public',type='http',website=True,csrf=False)
def util2(自身,**kwargs):
返回self.message()
我读了很多关于继承的书,但仍然找不到解决这个问题的方法。这可能是因为它在odoopython中有不同的系统吗
编辑:
下面是基于@Bruno的答案的代码
class Animal():
名称=‘动物’
能力=‘无’
def消息(自我):
返回“Name:{self.Name}| Ability:{self.Ability}”。格式(self=self)
鸟类(动物)类别:
名称='Bird'
能力=‘飞行’
鱼类(动物)类别:
名称=‘鱼’
能力=‘游泳’
类MyController(http.Controller):
定义初始化(自):
自我。_animal=animal()
self._bird=bird()
self._fish=fish()
@http.route('/animal',auth='public',type='http',website=True,csrf=False)
def动物(自身,**kwargs):
返回自我。_animal.message()
@http.route('/animal/bird',auth='public',type='http',website=True,csrf=False)
def bird(自身,**kwargs):
返回自我。_bird.message()
@http.route('/animal/fish',auth='public',type='http',website=True,csrf=False)
def鱼(自身,**kwargs):
返回自我。_fish.message()
您实际上是在尝试继承http.controller吗?如果是这样的话,Odoo中默认的0Auth模块可能会向您展示它是如何安排的(因为它也继承了这个类)
如果您只是想向Odoo添加一个新类,请注意它有自己的继承系统,这在文档中有描述(其工作原理与默认python有很大不同):
请注意,尽管我个人没有在Odoo中继承除Odoo对象以外的任何东西的经验,我在标准插件中找到了很多可以帮助你的例子。警告:我根本没有使用过odoo,所以这个答案在一定程度上是基于我从文档中得到的信息和你描述的行为而做出的猜测
,看起来从控制器继承实际上会覆盖原始控制器,而不是添加新的控制器(注意:上面的警告是否正确?)。如果是这样,您可以尝试使用多重继承,将特定功能提取到非控制器基类:
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框架的情况,并且由于路由
装饰器将应用于方法,因此我假设这里的工作原理相同),因此只保留一个控制器并委托给您的动物
层次结构可能更简单:
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期望和项目需求 类应该有一个构造函数:def uu init uu(self):内部有self.name='Animal'和self.ability='none',谢谢您的评论。你能写一些简单的例子吗?问题不是继承。看看这里的简单类示例(9.3.2):或者这里看起来每个类都覆盖了前面定义的路由。您可能想调查路线定义在odoo中是如何工作的。谢谢@seb007我尝试了您的建议。但它们仍然产生了相同的结果。这里是新的代码:你链接的文档也是关于奥多模型的,OP正在与控制器合作。谢谢大家,现在已经解决了。谢谢布鲁诺。哦,哇,太谢谢你了,伙计。它有效!!!!谢谢,谢谢。我已经更新了有效的代码。很高兴能帮上忙。只是一个问题:您真的需要让您的
Animal
类从控制器继承吗?(我知道你发布了一段简化的代码片段,但仍然…)不。。。我的错误。是的,我们不必从http.controller继承动物。对不起,你是对的。嗯,你可能有这样做的理由——就像我说的,我对奥多一无所知,我也不知道你到底想做什么(因为你所发布的显然是一个玩具示例)。哈哈,是的。tks再次配对。你帮了大忙。上帝保佑你。