2017-04-06 1 views
1

私はPython Webアプリケーションを持っているので、Webページを処理する一般的なクラスや関数を定義し、特定のページインスタンスに対してより特定のクラスから呼び出す。別のクラスからクラスメソッドを呼び出すとメタクラスの競合が発生する

エラー:

metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

私はそのエラーメッセージに関するすべてのStackOverflowの質問&答えをチェックしているとした説明を理解する(と私は理解していなかったメタクラスに関する記事が見つかりませんでした - OOPは本当に私のものではありません)。私はまた、StackOverflowのすべての質問&は、別のクラスからのクラスメソッドを呼び出す(それらを理解していない)についての答えを見た。

コード:私はメタクラスのエラーを取得せずにAuditorsPageクラスからmyPageクラスのoutputHtmlメソッドを呼び出すにはどうすればよい

import webapp2 
from datetime import datetime, timedelta 

from google.appengine.ext import ndb 
from google.appengine.api import users 

import admin_templates 
import authenticate 

class myPage(webapp2.RequestHandler): 
    def get(pageInstance): 
     pageInstance.outputHtml() 

    def outputHtml(pageInstance,pageTitle,pageContent): 
     adminLink = authenticate.get_adminlink() 
     authMessage = authenticate.get_authmessage() 
     adminNav = authenticate.get_adminnav() 
     pageInstance.response.headers['Content-Type'] = 'text/html' 
     html = admin_templates.base 
     html = html.replace('#title#', pageTitle) 
     html = html.replace('#authmessage#', authMessage) 
     html = html.replace('#adminlink#', adminLink) 
     html = html.replace('#adminnav#', adminNav) 
     html = html.replace('#content#', pageContent) 
     pageInstance.response.out.write(html) 
     pageInstance.response.out.write(admin_templates.footer) 

class AuditorsPage(webapp2.RequestHandler, myPage.outputHtml): 
    def get(self): 
     self.output_auditors() 

    def output_auditors(self): 
     self.outputHtml(admin_templates.auditors_title, admin_templates.auditors_content) 

+1

なぜ 'AuditorsPage'は' myPage'の*メソッド*から継承しようとしていますか? – chepner

+0

特別な理由はありません!ただ私は不適格! –

+0

編集に感謝します。 –

答えて

1

エラーは、一般クラスのメソッドからクラスをサブクラス化しているために発生します。実際にコードが間違っていて、それを修正できる方法は少なくとも2つあります。

1)myPageから継承する:この場合は動作しません.MROエラーは表示されません。 selfを最初のパラメータとして使用してオブジェクトにリンクされていないため、クラスのインスタンスの一部です。

これは、この場合、あなたのコードの修正です:

from google.appengine.ext import ndb 
from google.appengine.api import users 

import admin_templates 
import authenticate 

class myPage(webapp2.RequestHandler): 
    def get(self, pageInstance): 
     pageInstance.outputHtml() 

    def outputHtml(self, pageInstance,pageTitle,pageContent): 
     adminLink = authenticate.get_adminlink() 
     authMessage = authenticate.get_authmessage() 
     adminNav = authenticate.get_adminnav() 
     pageInstance.response.headers['Content-Type'] = 'text/html' 
     html = admin_templates.base 
     html = html.replace('#title#', pageTitle) 
     html = html.replace('#authmessage#', authMessage) 
     html = html.replace('#adminlink#', adminLink) 
     html = html.replace('#adminnav#', adminNav) 
     html = html.replace('#content#', pageContent) 
     pageInstance.response.out.write(html) 
     pageInstance.response.out.write(admin_templates.footer) 

class AuditorsPage(myPage): 
    def get(self): 
     self.output_auditors() 

2)だけでなしクラスと通常のメソッドとしてマイページクラスの2つのメソッドを取得した後、あなたのクラスから直接それらを呼び出します。実際には、create outputHtml()メソッドが必要です。そして、それを直接(self.なし)、あなたのRequestHandlerサブクラスのメソッドから呼び出してください。

+0

ありがとうございます - 私はあなたの最初の提案を使用しました –

1

はこれを試してみてください:

myPage.outputHtml() 

の代わり:

​​
0

あなたの質問に基本、私はあなたがマイページからメソッドを継承したいと思います。その場合は、代わりに:

class AuditorsPage(webapp2.RequestHandler, myPage.outputHtml): 

試してください:クラスAuditorsPagemyPage

import webapp2 
from datetime import datetime, timedelta 

from google.appengine.ext import ndb 
from google.appengine.api import users 

import admin_templates 
import authenticate 

class myPage(webapp2.RequestHandler): 
    def get(pageInstance): 
     pageInstance.outputHtml() 

    def outputHtml(pageInstance,pageTitle,pageContent): 
     adminLink = authenticate.get_adminlink() 
     authMessage = authenticate.get_authmessage() 
     adminNav = authenticate.get_adminnav() 
     pageInstance.response.headers['Content-Type'] = 'text/html' 
     html = admin_templates.base 
     html = html.replace('#title#', pageTitle) 
     html = html.replace('#authmessage#', authMessage) 
     html = html.replace('#adminlink#', adminLink) 
     html = html.replace('#adminnav#', adminNav) 
     html = html.replace('#content#', pageContent) 
     pageInstance.response.out.write(html) 
     pageInstance.response.out.write(admin_templates.footer) 

class AuditorsPage(myPage): 
    def get(self): 
     self.output_auditors() 

から継承でき

class AuditorsPage(webapp2.RequestHandler, myPage): 
+0

次のエラーが発生しました: 'TypeError:メタクラスベースを呼び出す際のエラー 整合性のあるメソッドの解決を作成できません ベースのmyPage、RequestHandlerの注文(MRO) –

+1

'myPage'クラスのメソッドは最初のパラメータとして' self'を持たないので、PythonはそれらのMROを把握できません。 – mydaemon

+0

クラップス。 @mydaemonは正しいです。 –

1

その後、あなたは(AuditorsPageをインスタンス化することができます)と直接outputHtml

を呼び出します
foo = AuditorsPage() 

foo.outputHtml(admin_templates.auditors_title, admin_templates.auditors_content) 
あなたがAuditorsPageのためのスーパーを呼び出していないので、[OK]を
+0

これはかなり近いですが、それでもエラーを投げました。私は、あなたがプロパティではなくメソッドが必要だと思います。 –

1

:私はあなたが何が起こっているかを説明するために持っているものの非常にストリップダウンバージョンを使用しています

class myPage(): 

    def __init__(self): 
     pass 

    def outputHtml(self): 
     print("outputHTML") 


class AuditorsPage(myPage): 

    def __init__(self): 
     super().__init__() 

    def output(self): 
     print("AuditorsPage") 

。ご覧のとおり、myClassクラスがあります。 AuditorsPageからオブジェクトを作成する際に、期待どおりにoutputHTMLメソッドにアクセスできるようになりました。お役に立てれば。

関連する問題