1

mongodb が使用する単純なモジュールの作成を開始しました。私はPythonが初めてで、私が書いたコードに問題がありました:

import pymongo


class mongoDB():

    conn = object

    def __init__(self):
        global conn
        self.conn = pymongo.Connection("localhost",27017)

    def CreateCollection(self,name =""):
        self.dbCollection  = conn.name
        return self.dbCollection

if __name__ == '__main__':
    database = mongoDB
    collection = database.CreateCollection("Hello")

まず、コードを見つけて修正していただければ、おそらくコードに問題があるとは思いません。また、私はこのエラーを受け取り続けています:

collection = database.CreateCollection("Hello")
TypeError: unbound method CreateCollection() must be called with mongoDB      

instance as first argument (got str instance instead)

クラスのコンストラクターで接続を作成し、コレクションを作成して返すメソッドと、エンティティを削除して更新する別のメソッドを作成できるようにしたい

4

2 に答える 2

18

したがって、構文に関しては、いくつかの問題があります。いくつかのチュートリアルをさまざまな方法で混合しているようです。それで、最初に私はあなたのコードで何が起こっているのかを説明し、あなたが見ているものを見ている理由を説明します:

import pymongo

class mongoDB():  # you don't need ()'s here - only if you are inheriting classes
                  # you could inherit from object here, which is a good practice
                  # by doing class mongoDb(object):, otherwise you can just take
                  # them out

    conn = object # here, you're defining a class member - global for all instances
                  # generally, you don't instantiate an object pointer like this,
                  # you would set it to None instead.  It won't fail doing this,
                  # but it's not "right"

    def __init__(self):
        # the __init__ method is the constructor method - this will 
        # allow you to initialize a particular instance of your class, represented
        # by the self argument.  This method is called when you call the class, i.e.
        # inst = mongoDb()

        # in this case, the conn variable is not a global.  Globals are defined
        # at the root module level - so in this example, only pymongo is a global
        # conn is a class member, and would be accessed by doing mongoDB.conn
        global conn

        # with that being said, you're initializing a local variable here called conn
        # that is not being stored anywhere - when this method finishes, this variable
        # will be cleaned up from memory, what you are thinking you're doing here
        # should be written as mongoDB.conn = pymongo.Connection("localhost", 27017)
        conn = pymongo.Connection("localhost",27017)

    def CreateCollection(name =""):
        # there is one of two things you are trying to do here - 1, access a class 
        # level member called conn, or 2, access an instance member called conn

        # depending on what you are going for, there are a couple of different ways 
        # to address it.

        # all methods for a class, by default, are instance methods - and all of them
        # need to take self as the first argument.  An instance method of a class
        # will always be called with the instance first.  Your error is caused because
        # you should declare the method as:

        # def CreateCollection(self, name = ""):

        # The alternative, is to define this method as a static method of the class -
        # which does not take an instance but applies to all instances of the class
        # to do that, you would add a @staticmethod decorator before the method.

        # either way, you're attempting to access the global variable "conn" here,
        # which again does not exist

        # the second problem with this, is that you are trying to take your variable
        # argument (name) and use it as a property.  What python is doing here, is
        # looking for a member variable called name from the conn object.  What you
        # are really trying to do is create a collection on the connection with the
        # inputed name

        # the pymongo class provides access to your collections via this method as a
        # convenience around the method, create_collection.  In the case where you
        # are using a variable to create the collection, you would call this by doing

        # conn.create_collection(name)

        # but again, that assumes conn is what you think it is, which it isn't
        dbCollection  = conn.name
        return dbCollection

if __name__ == '__main__':
    # here you are just creating a pointer to your class, not instantiating it
    # you are looking for:

    # database = mongoDB()
    database = mongoDB

    # this is your error, because of the afore mentioned lack of 'self' argument
    collection = database.CreateCollection("Hello")

コードを「フロー」にする方法については、Pep-8(http://www.python.org/dev/peps/pep-0008/)コーディングスタイルガイド(非常に役立つ)をご覧ください。 pythonically。

何が起こっているのかを説明するためにコードを調べた後、これが最終的にやろうとしていることです。

import pymongo

class MongoDB: # Classes generally are camel-case, starting with uppercase
    def __init__(self, dbname):
        # the __init__ method is the class constructor, where you define
        # instance members.  We'll make conn an instance member rather
        # than a class level member
        self._conn = pymongo.Connection("localhost", 27017)
        self._db   = self._conn[dbname]

    # methods usually start with lowercase, and are either camel case (less desirable
    # by Python standards) or underscored (more desirable)
    # All instance methods require the 1st argument to be self (pointer to the
    # instance being affected)
    def createCollection(self, name=""):
        return self._db[name]

if __name__ == '__main__':
    # you want to initialize the class
    database   = MongoDB("Hello")
    collection = database.createCollection("MyTable")

そのことを考えると、このクラスラッパーを作成する目的は何ですか?同じことを次のように書くことができます:

import pymongo
conn       = pymongo.Connection('localhost', 27017)
database   = conn["Hello"]
collection = database["MyTable"]

pymongoデータベースをラップするより大きなAPIを作成しようとしている場合は、すでに構築されているいくつかのORMモジュールを調べることをお勧めします。そこにはいくつかあります-MongoDBで利用できるものが100%確実ではありませんが、私が使用しているもの(私は偏っています、私はそれを書きました)はORBと呼ばれ、http://docs.projexsoftware.com/で見つけることができますapi / orb

于 2012-08-06T17:38:30.413 に答える
1

これは、問題を解決する方法に対する具体的な回答ではなく、やりたいことを段階的に実行し、より単純な問題が発生したときに対処する方法についての回答です。

1)最初はクラスを忘れて、代わりに

2) Python コマンド ラインまたは IDLE などの Python プログラムを使用します。

3) MongoDB データベースを開くための呼び出しを記述して、タスクを達成することで目標を確立する。つまり、クラスについて心配する前に、目標を達成するための最も単純なコードを記述してください。

4) それが完了し、次に進むことに満足したら、ドキュメントを使用してテスト クラスを記述します。私のリンクは、あなたが見つけることができる多くのリンクの 1 つです。

5)あなたの問題のすべてではありませんが、クラスが正しく設定されていないことが一部だと思います。私のクラス (完全には示されていません) は次のとおりです。

class GlobalData:
    def set_xfer_date(self, value):
        self.xfer_date = value
        self.date_str = str(value)
        self.xfer_date_base = self.date_str[0:10] + " " + "00:00:00"

        # Now build tomorrow.
        self.xfer_date_tomorrow = datetime.today() + timedelta(1)
        self.date_str_tomorrow = str(self.xfer_date_tomorrow) 
        self.xfer_date_tomorrow = \
          self.date_str_tomorrow[0:10] + " " + "00:00:00" 

        self.section_totals = {}
        self.billable_reads = {}

    def set_xfer_fnam_out(self, value):
        self.xfer_fnam_out = value

    def set_xfer_dir_in(self, value):
        self.xfer_dir_in = value
    .
    .
    .

    def get_billable_reads(self):
        return self.billable_reads

self. 私が目にする問題の 1 つは、 Good luckyを使用してデータを参照していないことです。

于 2012-08-06T17:42:56.480 に答える