0

このコードを考えてみましょう。

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

コードを実際のバージョンに編集しました。このような速い入力をみんなに感謝します!!! あなたたち最高!それでもおそらく最善のアプローチではありませんが、現時点ではそれを解決する別の方法を考えることはできません。

4

4 に答える 4

0

への参照を保存してから、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 , ]

これにより、複数のページセットを作成できるようになり、クラスインスタンスを見ていることに注意してください。上記のコードは、クラス自体を参照しています(これを行う理由は実際にはありません)。他のデータをページセットにself.pages保存したい場合があるので、属性として入力します。

于 2013-03-05T22:44:52.010 に答える
0

.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

于 2013-03-05T22:45:15.567 に答える
0

ここでの最善の解決策は、select()メソッドをPagesクラスに移動することです。

class Pages(object):
    ...
    def select(self, target):
        for page in self:
           page.select = False
        target.select = True

私には、これはそれが置かれるためのより論理的な場所のように見え、インスタンスが属するインスタンスPageについて知る必要がないことを意味します。Pages

選択されているかどうかをそれぞれが知るのではなく、選択されたページを保持するインスタンスにselected属性を設定する方がよい場合もありますが、それは設計によって異なります。PagesPage

于 2013-03-05T22:47:04.367 に答える
0

Pagesオブジェクトは、多数の個別のPageオブジェクトを管理します。たとえば、1つのページに選択済みのフラグを付けたり、他のページのフラグを解除したりするなど、それらすべてをセットとして含むものを担当する必要があります。

各ページにそれを所有するPagesオブジェクトを認識させることもできますが、これをやりすぎると、すぐにスパゲッティコードが混乱する可能性があります。

PS- Page -sを持っていることについて話していても、 Pagesは不快ですが、もっと良い名前を考えてみてください。

于 2013-03-05T22:49:23.440 に答える