考虑这段代码:
class Page(object):
def __init__(self, name, title):
self.name = name
self.title = title
self.selected = False
def select(self): <-- How can I make this method work?
for Page in Pages:
Page.selected = False
self.selected = True
class Website(object):
def __init__(self):
self.index = Page("index", "Home")
self.settings = Page("settings", "Settings")
self.users = Page("users", "Users")
self.logs = Page("logs", "Logs")
self.faq = Page("faq", "FAQ")
def __iter__(self):
return iter([self.index, self.settings, self.users, self.logs, self.faq])
Pages = Website()
我想做的事似乎有点违法。然而,我确信有办法做到这一点。似乎我可能不得不重写get方法的某个地方。非常感谢您的帮助!
下面是我打算使用Bottlepy使用这些类的方式:
设置页面:
@route('/')
@route('/<selectedPage>')
@route('/<selectedPage>/')
def dynamic_routing(selectedPage='index'):
for Page in Pages:
if selectedPage == Page.name:
Page.select()
return template('default')
检索页面信息(在Bottlepy模板中):
%for Page in Pages:
%if Page.selected:
<title>{{Page.title}}</title>
%else:
<title>Page Not Found</title>
%end
%end
我现在编辑代码到一个工作版本。感谢大家这么快的输入!!你们太棒了!这可能不是最好的方法,但目前我想不出其他方法来解决这个问题。
您需要重命名.select
属性或.select()
方法,并向该方法添加self
参数,但否则您的代码将正常工作:
class Page(object):
def __init__(self, name, title):
self.name = name
self.title = title
self.selected = False
def select(self):
for Page in Pages:
Page.selected = False
self.selected = True
有了这些修改,你的代码就可以工作了:
>>> Pages = Pages()
>>> Pages.index
<__main__.Page object at 0x10a0b6cd0>
>>> Pages.index.selected
False
>>> Pages.index.select()
>>> Pages.index.selected
True
>>> Pages.faq.select()
>>> Pages.index.selected
False
然而,这并不是说这是一个好的架构设计。我想说的是,您需要将选择页面的责任转移到Pages
类,最重要的是避免用全局实例Pages
替换Pages
类。
我认为这里最好的解决方案是将select()
方法移动到Pages
类:
class Pages(object):
...
def select(self, target):
for page in self:
page.select = False
target.select = True
对我来说,这似乎是一个更合乎逻辑的位置,这意味着Page
实例不需要知道它们所属的Pages
实例。
在保存所选页面的Pages
实例上有一个selected
属性可能更好,而不是每个Page
知道它是否被选中,但这取决于设计。
一个Pages对象管理许多单独的Page对象。它应该负责将所有页面作为一个集合,例如,在您的示例中,将单个页面标记为选中,并取消其他页面的标记。
虽然您可以让每个Page都知道拥有它的Pages对象,但这样做太多可能会很快导致混乱的意大利面条代码。
注:-试着想出一些更好的名字,甚至谈论有Page-s和Pages是不舒服的。
存储ref到pageset
,然后遍历该集合中的页面
class Page(object):
def __init__(self, name, title, pageset):
self.name = name
self.title = title
self.pageset = pageset
def select(self):
for page in self.pageset.pages:
page.select = False
self.select = True
class Pageset(object):
def __init__(self):
self.index = Page("index", "Home", self )
self.settings = Page("settings", "Settings", self )
self.pages = [ self.index , self.settings , ]
请注意,这使您能够拥有多个pagesset,并且您正在查看类实例。上面的代码引用了类本身(实际上没有理由这样做)。我把self.pages
作为一个属性,因为你可能想在一个页面集中存储其他数据。